tRPC Hinzugefügt
This commit is contained in:
@@ -24,6 +24,8 @@
|
|||||||
"@ibcornelsen/database": "link:@ibcornelsen/database",
|
"@ibcornelsen/database": "link:@ibcornelsen/database",
|
||||||
"@ibcornelsen/ui": "^0.0.2",
|
"@ibcornelsen/ui": "^0.0.2",
|
||||||
"@mollie/api-client": "^3.7.0",
|
"@mollie/api-client": "^3.7.0",
|
||||||
|
"@trpc/client": "^10.45.0",
|
||||||
|
"@trpc/server": "^10.45.0",
|
||||||
"astro": "^2.5.1",
|
"astro": "^2.5.1",
|
||||||
"astro-i18next": "1.0.0-beta.21",
|
"astro-i18next": "1.0.0-beta.21",
|
||||||
"bun": "^1.0.2",
|
"bun": "^1.0.2",
|
||||||
@@ -46,6 +48,7 @@
|
|||||||
"svelte": "^3.59.1",
|
"svelte": "^3.59.1",
|
||||||
"svelte-preprocess": "^5.0.3",
|
"svelte-preprocess": "^5.0.3",
|
||||||
"tailwindcss": "^3.3.2",
|
"tailwindcss": "^3.3.2",
|
||||||
|
"trpc-openapi": "^1.2.0",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^9.0.0",
|
||||||
"vite-tsconfig-paths": "^4.2.0",
|
"vite-tsconfig-paths": "^4.2.0",
|
||||||
"zod": "^3.21.4"
|
"zod": "^3.21.4"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { endEnergieVerbrauch } from "#lib/Berechnungen/endEnergieVerbrauch";
|
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
|
||||||
import { BedarfsausweisWohnen, GebaeudeStammdaten, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
|
import { BedarfsausweisWohnen, GebaeudeStammdaten, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
|
||||||
|
|
||||||
export let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
export let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||||
@@ -40,9 +40,13 @@
|
|||||||
let translation_2 = 0;
|
let translation_2 = 0;
|
||||||
$: {
|
$: {
|
||||||
(async () => {
|
(async () => {
|
||||||
const energieVerbrauch = (await endEnergieVerbrauch({ ...ausweis, gebaeude_stammdaten: gebaeude}));
|
const result = (await endEnergieVerbrauchVerbrauchsausweis_2016({ ...ausweis, gebaeude_stammdaten: gebaeude}));
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
return
|
||||||
|
}
|
||||||
//const primaerEnergieVerbrauch = (await ausweis.primaerEnergieBedarf);
|
//const primaerEnergieVerbrauch = (await ausweis.primaerEnergieBedarf);
|
||||||
translation_1 = Math.max(0, Math.min(100, energieVerbrauch / maxPerformance * 100))
|
translation_1 = Math.max(0, Math.min(100, result.endEnergieVerbrauchGesamt / maxPerformance * 100))
|
||||||
//translation_2 = Math.max(0, Math.min(100, primaerEnergieVerbrauch / maxPerformance * 100))
|
//translation_2 = Math.max(0, Math.min(100, primaerEnergieVerbrauch / maxPerformance * 100))
|
||||||
})()
|
})()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ export function auditBedarfsausweisBenoetigt(ausweis: VerbrauchsausweisWohnen, g
|
|||||||
if (gebaeude.baujahr_gebaeude && gebaeude.baujahr_gebaeude.length > 0) {
|
if (gebaeude.baujahr_gebaeude && gebaeude.baujahr_gebaeude.length > 0) {
|
||||||
return (
|
return (
|
||||||
(gebaeude.baujahr_gebaeude[0] < 1978 &&
|
(gebaeude.baujahr_gebaeude[0] < 1978 &&
|
||||||
gebaeude.einheiten <= 4 &&
|
(gebaeude.einheiten || 0) <= 4 &&
|
||||||
gebaeude.saniert == false &&
|
gebaeude.saniert == false &&
|
||||||
(ausweis.ausstellgrund == "Vermietung" ||
|
(ausweis.ausstellgrund == "Vermietung" ||
|
||||||
ausweis.ausstellgrund == "Sonstiges" ||
|
ausweis.ausstellgrund == "Sonstiges" ||
|
||||||
|
|||||||
@@ -51,8 +51,7 @@
|
|||||||
<input
|
<input
|
||||||
name={name}
|
name={name}
|
||||||
id={name}
|
id={name}
|
||||||
class=""
|
type="text"
|
||||||
type="number"
|
|
||||||
required
|
required
|
||||||
readonly={readonly}
|
readonly={readonly}
|
||||||
bind:value={zip}
|
bind:value={zip}
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
import { Bedarfsausweis } from "./Bedarfsausweis";
|
|
||||||
import { Verbrauchsausweis } from "./Verbrauchsausweis";
|
|
||||||
import { VerbrauchsausweisGewerbe } from "./VerbrauchsausweisGewerbe";
|
|
||||||
|
|
||||||
export enum AusweisType {
|
|
||||||
VERBRAUCHSAUSWEIS,
|
|
||||||
VERBRAUCHSAUSWEIS_NICHT_WOHNGEBAEUDE,
|
|
||||||
BEDARFSAUSWEIS,
|
|
||||||
}
|
|
||||||
|
|
||||||
export type Ausweisart = "VA" | "BA" | "VANW";
|
|
||||||
export type Ausstellgrund =
|
|
||||||
| "Vermietung"
|
|
||||||
| "Neubau"
|
|
||||||
| "Verkauf"
|
|
||||||
| "Modernisierung"
|
|
||||||
| "Sonstiges";
|
|
||||||
|
|
||||||
export type Lueftungskonzept = "Fensterlüftung" | "Schachtlüftung" | "Lüftungsanlage ohne Wärmerückgewinnung" | "Lüftungsanlage mit Wärmerückgewinnung"
|
|
||||||
|
|
||||||
export type Ausweis = Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe;
|
|
||||||
|
|
||||||
export function getAusweis(ausweisart: Ausweisart, initializer?: Ausweis): Ausweis {
|
|
||||||
let ausweis;
|
|
||||||
|
|
||||||
if (ausweisart == "VA") {
|
|
||||||
ausweis = new Verbrauchsausweis();
|
|
||||||
} else if (ausweisart == "VANW") {
|
|
||||||
ausweis = new VerbrauchsausweisGewerbe();
|
|
||||||
} else if (ausweisart == "BA") {
|
|
||||||
ausweis = new Bedarfsausweis();
|
|
||||||
} else {
|
|
||||||
throw new Error("Unbekannte Ausweisart.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return ausweis;
|
|
||||||
}
|
|
||||||
@@ -1,437 +0,0 @@
|
|||||||
import { Moment } from "moment";
|
|
||||||
import { getHeizwertfaktor } from "../server/Heizwertfaktor";
|
|
||||||
import moment from "moment";
|
|
||||||
import { BitChecker } from "../BitChecker";
|
|
||||||
import { getHeizungswerte } from "../Heizungswerte";
|
|
||||||
import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types";
|
|
||||||
|
|
||||||
export class Bedarfsausweis {
|
|
||||||
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[] = [];
|
|
||||||
public anzahl_einheiten: number = 0;
|
|
||||||
|
|
||||||
public erstellungsdatum: Date = new Date();
|
|
||||||
public ausstellgrund: Ausstellgrund = "Vermietung";
|
|
||||||
|
|
||||||
public energieverbrauch_zeitraum: Moment = moment();
|
|
||||||
public energieverbrauch_1_heizquelle_1: number = 0;
|
|
||||||
public energieverbrauch_2_heizquelle_1: number = 0;
|
|
||||||
public energieverbrauch_3_heizquelle_1: number = 0;
|
|
||||||
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 uid: string = "";
|
|
||||||
|
|
||||||
public wohnflaeche: number = 0;
|
|
||||||
public keller_beheizt: boolean = false;
|
|
||||||
public dachgeschoss: Dachgeschoss = Dachgeschoss.UNBEHEIZT;
|
|
||||||
public zusaetzliche_heizquelle: boolean = false;
|
|
||||||
public warmwasser_enthalten: boolean = false;
|
|
||||||
public lueftungskonzept: Lueftungskonzept = "Fensterlüftung";
|
|
||||||
public wird_gekuehlt: boolean = false;
|
|
||||||
public leerstand: number = 0;
|
|
||||||
public images: string[] = [];
|
|
||||||
|
|
||||||
public versorgungssysteme: boolean[] = BitChecker(0);
|
|
||||||
public fenster_dach: boolean[] = BitChecker(0);
|
|
||||||
public energiequelle_2_nutzung: boolean[] = BitChecker(0);
|
|
||||||
public daemmung: boolean[] = BitChecker(0);
|
|
||||||
public get energetische_nutzfläche(): number {
|
|
||||||
if (this.geschosshoehe < 2.5 || this.geschosshoehe > 3) {
|
|
||||||
return (1 / this.geschosshoehe - 0.04) * this.volumen;
|
|
||||||
} else {
|
|
||||||
return 0.32 * this.volumen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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: number = 0;
|
|
||||||
public fenster_flaeche_2: number = 0;
|
|
||||||
public fenster_art_2: number = 0;
|
|
||||||
public dachfenster_flaeche: number = 0;
|
|
||||||
public dachfenster_art: number = 0;
|
|
||||||
public haustuer_flaeche: number = 0;
|
|
||||||
public haustuer_art: number = 0;
|
|
||||||
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 = "";
|
|
||||||
|
|
||||||
// Temporär
|
|
||||||
public tabellenwerte_aendern: boolean = false;
|
|
||||||
|
|
||||||
public gebaeude_uid?: string;
|
|
||||||
public kennwerte: Energiekennwerte = new Energiekennwerte();
|
|
||||||
|
|
||||||
public constructor() {}
|
|
||||||
|
|
||||||
public static fromBase64(base64: string): Bedarfsausweis | null {
|
|
||||||
try {
|
|
||||||
const text = Buffer.from(base64, "base64");
|
|
||||||
|
|
||||||
const json = JSON.parse(text.toString());
|
|
||||||
return json;
|
|
||||||
} catch (e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public get primaerEnergieBedarf(): number {
|
|
||||||
const Endenergieverbrauch = this.endEnergieVerbrauch;
|
|
||||||
|
|
||||||
const brennstoff_1 = getHeizwertfaktor(
|
|
||||||
this.energietraeger_1,
|
|
||||||
this.energietraeger_einheit_heizquelle_1
|
|
||||||
);
|
|
||||||
|
|
||||||
return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public get endEnergieVerbrauch(): number {
|
|
||||||
let dach_u_wert = 1 / (1 / this.dach_daemmung / 0.04);
|
|
||||||
let aussenwand_u_wert = 1 / (1 / this.aussenwand_daemmung / 0.04);
|
|
||||||
let fussboden_u_wert = 1 / (1 / this.boden_daemmung / 0.04);
|
|
||||||
let decke_u_wert = 1 / (1 / this.decke_daemmung / 0.04);
|
|
||||||
|
|
||||||
if (!this.tabellenwerte_aendern) {
|
|
||||||
this.dach_u_wert = Math.round(dach_u_wert);
|
|
||||||
this.decke_u_wert = Math.round(decke_u_wert);
|
|
||||||
this.aussenwand_u_wert = Math.round(aussenwand_u_wert);
|
|
||||||
this.fussboden_u_wert = Math.round(fussboden_u_wert);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.dachgeschoss) {
|
|
||||||
var IOGdeckef = 0;
|
|
||||||
var dachgeschossf = 0.5;
|
|
||||||
var dachgeschossf2 = 1;
|
|
||||||
} else if (!this.dachgeschoss) {
|
|
||||||
var IOGdeckef = 0.8;
|
|
||||||
var dachgeschossf = 0;
|
|
||||||
var dachgeschossf2 = 0;
|
|
||||||
// TODO: Dachgeschoss braucht 3 optionen
|
|
||||||
} else {
|
|
||||||
var IOGdeckef = 1;
|
|
||||||
var dachgeschossf = 0;
|
|
||||||
var dachgeschossf2 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.keller_beheizt) {
|
|
||||||
var keller_beheizt = 1;
|
|
||||||
} else {
|
|
||||||
var keller_beheizt = 0;
|
|
||||||
}
|
|
||||||
var gaubenflaeche =
|
|
||||||
this.breite_gauben * 2 * 0.3 + this.anzahl_gauben * 2 * 1.5;
|
|
||||||
var gaubenvolumen = this.breite_gauben * 1.5;
|
|
||||||
|
|
||||||
let aussenwand_anteil = 1;
|
|
||||||
if (
|
|
||||||
this.objekt_typ === "Doppelhaushälfte" ||
|
|
||||||
this.objekt_typ === "Reihenendhaus"
|
|
||||||
) {
|
|
||||||
aussenwand_anteil = 0.7;
|
|
||||||
} else if (this.objekt_typ === "Reihenmittelhaus") {
|
|
||||||
aussenwand_anteil = 0.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Außenwand
|
|
||||||
var aussenwand_flaeche =
|
|
||||||
((2 * this.masse_a +
|
|
||||||
2 * this.masse_b +
|
|
||||||
2 * this.masse_d +
|
|
||||||
2 * this.masse_e +
|
|
||||||
2 * this.masse_f) *
|
|
||||||
this.geschosshoehe *
|
|
||||||
this.anzahl_vollgeschosse +
|
|
||||||
2 * this.masse_a * this.geschosshoehe * dachgeschossf +
|
|
||||||
(2 * this.masse_a +
|
|
||||||
2 * this.masse_b +
|
|
||||||
2 * this.masse_d +
|
|
||||||
2 * this.masse_e +
|
|
||||||
2 * this.masse_f) *
|
|
||||||
2.2 *
|
|
||||||
keller_beheizt) *
|
|
||||||
aussenwand_anteil -
|
|
||||||
this.fenster_flaeche_1 -
|
|
||||||
this.fenster_flaeche_2 -
|
|
||||||
this.haustuer_flaeche +
|
|
||||||
gaubenflaeche;
|
|
||||||
|
|
||||||
if (!this.tabellenwerte_aendern) {
|
|
||||||
this.aussenwand_flaeche = Math.round(aussenwand_flaeche);
|
|
||||||
}
|
|
||||||
|
|
||||||
var dachflaeche =
|
|
||||||
((this.masse_a * this.masse_b +
|
|
||||||
this.masse_c * this.masse_d +
|
|
||||||
(+this.masse_f + +this.masse_c) * this.masse_e) *
|
|
||||||
1.2 -
|
|
||||||
this.dachfenster_flaeche) *
|
|
||||||
dachgeschossf2;
|
|
||||||
if (!this.tabellenwerte_aendern) {
|
|
||||||
this.dachflaeche = Math.round(dachflaeche);
|
|
||||||
}
|
|
||||||
var deckenflaeche =
|
|
||||||
(this.masse_a * this.masse_b +
|
|
||||||
this.masse_c * this.masse_d +
|
|
||||||
(+this.masse_f + +this.masse_c) * this.masse_e -
|
|
||||||
this.dachfenster_flaeche) *
|
|
||||||
IOGdeckef;
|
|
||||||
if (!this.tabellenwerte_aendern) {
|
|
||||||
this.deckenflaeche = Math.round(deckenflaeche);
|
|
||||||
}
|
|
||||||
var fussboden_flaeche =
|
|
||||||
this.masse_a * this.masse_b +
|
|
||||||
this.masse_c * this.masse_d +
|
|
||||||
(+this.masse_f + +this.masse_c) * this.masse_e;
|
|
||||||
if (!this.tabellenwerte_aendern) {
|
|
||||||
this.fussboden_flaeche = Math.round(fussboden_flaeche);
|
|
||||||
}
|
|
||||||
|
|
||||||
var volumen =
|
|
||||||
fussboden_flaeche * this.geschosshoehe * this.anzahl_vollgeschosse +
|
|
||||||
fussboden_flaeche * 2.2 * keller_beheizt +
|
|
||||||
fussboden_flaeche * this.geschosshoehe * dachgeschossf +
|
|
||||||
gaubenvolumen;
|
|
||||||
if (!this.tabellenwerte_aendern) {
|
|
||||||
this.volumen = Math.round(volumen);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.dicht) {
|
|
||||||
var Hv = 0.163 * volumen;
|
|
||||||
} else {
|
|
||||||
var Hv = 0.19 * volumen;
|
|
||||||
}
|
|
||||||
|
|
||||||
var AHF =
|
|
||||||
this.aussenwand_flaeche +
|
|
||||||
this.fussboden_flaeche +
|
|
||||||
this.dachflaeche +
|
|
||||||
this.deckenflaeche +
|
|
||||||
this.fenster_flaeche_2 +
|
|
||||||
this.haustuer_flaeche +
|
|
||||||
this.dachfenster_flaeche +
|
|
||||||
this.fenster_flaeche_1;
|
|
||||||
|
|
||||||
let AN = this.energetische_nutzfläche;
|
|
||||||
|
|
||||||
var Qi = 22 * AN;
|
|
||||||
// NOTE: Irgendwie sowas wie Gesamtwärmestrom der entweicht.
|
|
||||||
var Qs =
|
|
||||||
270 * this.fensterflaeche_so_sw * 0.567 * 0.75 +
|
|
||||||
100 * this.fensterflaeche_nw_no * 0.567 * 0.75 +
|
|
||||||
225 * this.dachfenster_flaeche * 0.567 * 0.75 +
|
|
||||||
155 *
|
|
||||||
(this.fenster_flaeche_2 +
|
|
||||||
this.dachfenster_flaeche +
|
|
||||||
this.fenster_flaeche_1 -
|
|
||||||
this.fensterflaeche_so_sw -
|
|
||||||
this.fensterflaeche_nw_no) *
|
|
||||||
0.567 *
|
|
||||||
0.75;
|
|
||||||
|
|
||||||
var Ht =
|
|
||||||
this.aussenwand_u_wert *
|
|
||||||
(this.aussenwand_flaeche - this.aussenwandflaeche_unbeheizt) +
|
|
||||||
this.aussenwand_u_wert * this.aussenwandflaeche_unbeheizt * 0.5 +
|
|
||||||
this.decke_u_wert * this.deckenflaeche * IOGdeckef +
|
|
||||||
this.fussboden_u_wert * this.fussboden_flaeche * 0.6 +
|
|
||||||
this.dach_u_wert * this.dachflaeche +
|
|
||||||
this.fenster_art_1 * this.fenster_flaeche_1 +
|
|
||||||
this.fenster_art_2 * this.fenster_flaeche_2 +
|
|
||||||
this.dachfenster_art * this.dachfenster_flaeche +
|
|
||||||
AHF * 0.05 +
|
|
||||||
this.haustuer_flaeche * this.haustuer_art;
|
|
||||||
|
|
||||||
var Qh = (66 * (Ht + Hv) - 0.95 * (Qs + Qi)) / AN;
|
|
||||||
|
|
||||||
var Solarsystem_WWbw = 0;
|
|
||||||
var Solarsystem_WWhb = 0;
|
|
||||||
|
|
||||||
if (AN < 500) {
|
|
||||||
if (this.versorgungssysteme[4]) {
|
|
||||||
var Solarsystem_WWbw = 11.3 - (3.3 / 350) * (AN - 150);
|
|
||||||
var Solarsystem_WWhb = 0.8 - (0.4 / 350) * (AN - 150);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.kollektor_flaeche != 0) {
|
|
||||||
var Solarsystem_WWbw = (this.kollektor_flaeche * 280) / AN;
|
|
||||||
var Solarsystem_WWhb = 0.8 - (0.4 / 350) * (AN - 150);
|
|
||||||
}
|
|
||||||
} else if (AN > 500 && AN < 7000) {
|
|
||||||
if (this.versorgungssysteme[4]) {
|
|
||||||
var Solarsystem_WWbw = 8 - (2 / 2000) * (AN - 500);
|
|
||||||
var Solarsystem_WWhb = 0.4 - (0.1 / 2000) * (AN - 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.kollektor_flaeche != 0) {
|
|
||||||
var Solarsystem_WWbw = (this.kollektor_flaeche * 280) / AN;
|
|
||||||
var Solarsystem_WWhb = 0.4 - (0.1 / 2000) * (AN - 500);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let hilfsenergie_lueftung = 0;
|
|
||||||
let waerme_gewinnung_lueftung = 0;
|
|
||||||
|
|
||||||
if (this.lueftungskonzept == "Lüftungsanlage mit Wärmerückgewinnung") {
|
|
||||||
hilfsenergie_lueftung = 0;
|
|
||||||
waerme_gewinnung_lueftung = 13.5;
|
|
||||||
}
|
|
||||||
if (this.lueftungskonzept == "Lüftungsanlage ohne Wärmerückgewinnung") {
|
|
||||||
if (this.baujahr_gebaeude < 1996) {
|
|
||||||
hilfsenergie_lueftung = 4;
|
|
||||||
waerme_gewinnung_lueftung = 3.5;
|
|
||||||
}
|
|
||||||
if (this.baujahr_gebaeude > 1996) {
|
|
||||||
hilfsenergie_lueftung = 2.6;
|
|
||||||
waerme_gewinnung_lueftung = 3.2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let [
|
|
||||||
heizung_zentralwv,
|
|
||||||
verteilunghwv,
|
|
||||||
spheizungwv,
|
|
||||||
werzeugungheaz,
|
|
||||||
verteilungwwwv,
|
|
||||||
verteilungwwhg,
|
|
||||||
warmwasser_speicherungwv,
|
|
||||||
warmwasser_speicherunghg,
|
|
||||||
werzeugungwweaz,
|
|
||||||
verteilunghhb,
|
|
||||||
spheizunghb,
|
|
||||||
werzeugunghhb,
|
|
||||||
verteilungwwhb,
|
|
||||||
warmwasser_speicherunghb,
|
|
||||||
werzeugungwwhb,
|
|
||||||
BRSPrimärenergiefaktor,
|
|
||||||
BRSPrimärenergiefaktor1,
|
|
||||||
Coeffizienz,
|
|
||||||
] = getHeizungswerte(
|
|
||||||
this.energietraeger_1,
|
|
||||||
this.energietraeger_2,
|
|
||||||
AN,
|
|
||||||
this.warmwasser_verteilung,
|
|
||||||
this.warmwasser_speicherung,
|
|
||||||
this.warmwasser_erzeugung,
|
|
||||||
this.heizung_zentral,
|
|
||||||
this.heizung_verteilung,
|
|
||||||
this.heizung_speicherung,
|
|
||||||
this.waerme_erzeugung_heizung
|
|
||||||
);
|
|
||||||
|
|
||||||
var end_energie_heizung =
|
|
||||||
(Qh + heizung_zentralwv + verteilunghwv + spheizungwv) *
|
|
||||||
werzeugungheaz -
|
|
||||||
waerme_gewinnung_lueftung;
|
|
||||||
|
|
||||||
var end_energie_warmwasser =
|
|
||||||
(12 +
|
|
||||||
verteilungwwwv -
|
|
||||||
verteilungwwhg +
|
|
||||||
warmwasser_speicherungwv -
|
|
||||||
warmwasser_speicherunghg) *
|
|
||||||
werzeugungwweaz;
|
|
||||||
|
|
||||||
var hilfsenergie =
|
|
||||||
verteilunghhb +
|
|
||||||
spheizunghb +
|
|
||||||
werzeugunghhb +
|
|
||||||
verteilungwwhb +
|
|
||||||
warmwasser_speicherunghb +
|
|
||||||
werzeugungwwhb +
|
|
||||||
Solarsystem_WWhb +
|
|
||||||
hilfsenergie_lueftung;
|
|
||||||
|
|
||||||
var endenergiegesamt = end_energie_heizung + end_energie_warmwasser + hilfsenergie;
|
|
||||||
|
|
||||||
var primheizung =
|
|
||||||
end_energie_heizung *
|
|
||||||
(1 - this.anteil_zusatzheizung) *
|
|
||||||
BRSPrimärenergiefaktor +
|
|
||||||
end_energie_heizung * this.anteil_zusatzheizung * BRSPrimärenergiefaktor1;
|
|
||||||
|
|
||||||
var primaerenergiebedarf =
|
|
||||||
primheizung +
|
|
||||||
(end_energie_warmwasser - Solarsystem_WWbw) * BRSPrimärenergiefaktor +
|
|
||||||
hilfsenergie * 1.8;
|
|
||||||
|
|
||||||
return endenergiegesamt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
import { getKlimafaktorenClient } from "../Klimafaktoren";
|
|
||||||
import { getHeizwertfaktor } from "../server/Heizwertfaktor";
|
|
||||||
import { Ausstellgrund, Ausweisart } from "./types";
|
|
||||||
import { Gebaeude } from "../Gebaeude";
|
|
||||||
import { User } from "#lib/User";
|
|
||||||
|
|
||||||
export class Verbrauchsausweis {
|
|
||||||
public id?: number;
|
|
||||||
public uid?: string;
|
|
||||||
public gebaeude_stammdaten: Gebaeude = new Gebaeude();
|
|
||||||
public benutzer?: User;
|
|
||||||
public rechnung?: any;
|
|
||||||
public erstellungsdatum: Date = new Date();
|
|
||||||
public ausstellgrund: Ausstellgrund = "Sonstiges";
|
|
||||||
public registriernummer: string = "";
|
|
||||||
public erledigt: boolean = false;
|
|
||||||
public baujahr_heizung: number[] = [];
|
|
||||||
public zusaetzliche_heizquelle: boolean = false;
|
|
||||||
public brennstoff_1: string = "Erdgas";
|
|
||||||
public einheit_1: string = "kWh";
|
|
||||||
public brennstoff_2: string = "Erdgas";
|
|
||||||
public einheit_2: string = "kWh";
|
|
||||||
public startdatum: Date = new Date();
|
|
||||||
public enddatum: Date = new Date();
|
|
||||||
public verbrauch_1: number = 0;
|
|
||||||
public verbrauch_2: number = 0;
|
|
||||||
public verbrauch_3: number = 0;
|
|
||||||
public verbrauch_4: number = 0;
|
|
||||||
public verbrauch_5: number = 0;
|
|
||||||
public verbrauch_6: number = 0;
|
|
||||||
public warmwasser_enthalten: boolean = false;
|
|
||||||
public anteil_warmwasser_1: number = 0;
|
|
||||||
public anteil_warmwasser_2: number = 0;
|
|
||||||
|
|
||||||
public get energetischeNutzflaeche(): number {
|
|
||||||
return (
|
|
||||||
this.gebaeude_stammdaten.wohnflaeche *
|
|
||||||
(this.gebaeude_stammdaten.keller_beheizt ? 1.35 : 1.2)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public constructor(initializer?: Verbrauchsausweis) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static fromBase64(base64: string): Verbrauchsausweis | null {
|
|
||||||
try {
|
|
||||||
const text = Buffer.from(base64, "base64");
|
|
||||||
|
|
||||||
const json = JSON.parse(text.toString());
|
|
||||||
return json;
|
|
||||||
} catch (e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public get primaerEnergieBedarf(): Promise<number> {
|
|
||||||
return (async () => {
|
|
||||||
const Endenergieverbrauch = await this.endEnergieVerbrauch;
|
|
||||||
|
|
||||||
const brennstoff_1 = getHeizwertfaktor(
|
|
||||||
this.brennstoff_1,
|
|
||||||
this.einheit_1
|
|
||||||
);
|
|
||||||
|
|
||||||
return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
public get endEnergieVerbrauch(): Promise<number> {
|
|
||||||
return (async () => {
|
|
||||||
const date = this.startdatum;
|
|
||||||
const klimafaktoren = await getKlimafaktorenClient(
|
|
||||||
date,
|
|
||||||
this.gebaeude_stammdaten.plz
|
|
||||||
);
|
|
||||||
|
|
||||||
// Endenergieverbrauch
|
|
||||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
|
||||||
let brennstoff_1 = getHeizwertfaktor(
|
|
||||||
this.brennstoff_1,
|
|
||||||
this.einheit_1
|
|
||||||
);
|
|
||||||
let brennstoff_2 = getHeizwertfaktor(
|
|
||||||
this.brennstoff_2,
|
|
||||||
this.einheit_2
|
|
||||||
);
|
|
||||||
|
|
||||||
let verbrauch_1_kwh =
|
|
||||||
this.verbrauch_1 * brennstoff_1.umrechnungsfaktor;
|
|
||||||
let verbrauch_2_kwh =
|
|
||||||
this.verbrauch_2 * brennstoff_1.umrechnungsfaktor;
|
|
||||||
let verbrauch_3_kwh =
|
|
||||||
this.verbrauch_3 * brennstoff_1.umrechnungsfaktor;
|
|
||||||
let verbrauch_4_kwh =
|
|
||||||
this.verbrauch_4 * brennstoff_2.umrechnungsfaktor;
|
|
||||||
let verbrauch_5_kwh =
|
|
||||||
this.verbrauch_5 * brennstoff_2.umrechnungsfaktor;
|
|
||||||
let verbrauch_6_kwh =
|
|
||||||
this.verbrauch_6 * brennstoff_2.umrechnungsfaktor;
|
|
||||||
|
|
||||||
let warmwasserZuschlag = 0;
|
|
||||||
let leerstandsZuschlag = 0;
|
|
||||||
let kuehlungsZuschlag = 0;
|
|
||||||
if (this.anteil_warmwasser_1 == 0) {
|
|
||||||
warmwasserZuschlag = 20 * this.energetischeNutzflaeche * 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.gebaeude_stammdaten.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.gebaeude_stammdaten.leerstand / 100)) /
|
|
||||||
durchschnittsKlimafaktor;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.gebaeude_stammdaten.energiequelle_2_nutzung[3]) {
|
|
||||||
kuehlungsZuschlag = 6 * this.energetischeNutzflaeche * 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.energetischeNutzflaeche;
|
|
||||||
|
|
||||||
|
|
||||||
return Energieverbrauchskennwert;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
import { Moment } from "moment";
|
|
||||||
import { getKlimafaktorenClient } from "../Klimafaktoren";
|
|
||||||
import { getHeizwertfaktor } from "../server/Heizwertfaktor";
|
|
||||||
import moment from "moment";
|
|
||||||
import { BitChecker } from "../BitChecker";
|
|
||||||
import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types";
|
|
||||||
|
|
||||||
|
|
||||||
export class VerbrauchsausweisGewerbe {
|
|
||||||
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[] = [];
|
|
||||||
public anzahl_einheiten: number = 0;
|
|
||||||
|
|
||||||
public erstellungsdatum: Date = new Date();
|
|
||||||
public ausstellgrund: Ausstellgrund = "Vermietung";
|
|
||||||
|
|
||||||
public energieverbrauch_zeitraum: Moment = moment();
|
|
||||||
public energieverbrauch_1_heizquelle_1: number = 0;
|
|
||||||
public energieverbrauch_2_heizquelle_1: number = 0;
|
|
||||||
public energieverbrauch_3_heizquelle_1: number = 0;
|
|
||||||
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 uid: string = "";
|
|
||||||
|
|
||||||
public wohnflaeche: number = 0;
|
|
||||||
public keller_beheizt: boolean = false;
|
|
||||||
public dachgeschoss: number = Dachgeschoss.UNBEHEIZT;
|
|
||||||
public zusaetzliche_heizquelle: boolean = false;
|
|
||||||
public warmwasser_enthalten: boolean = false;
|
|
||||||
public lueftungskonzept: Lueftungskonzept = "Fensterlüftung";
|
|
||||||
public wird_gekuehlt: boolean = false;
|
|
||||||
public leerstand: number = 0;
|
|
||||||
public images: string[] = [];
|
|
||||||
|
|
||||||
public versorgungssysteme: boolean[] = BitChecker(0);
|
|
||||||
public fenster_dach: boolean[] = BitChecker(0);
|
|
||||||
public energiequelle_2_nutzung: boolean[] = BitChecker(0);
|
|
||||||
public daemmung: boolean[] = BitChecker(0);
|
|
||||||
public get energetische_nutzfläche(): number {
|
|
||||||
return this.wohnflaeche * (this.keller_beheizt ? 1.35 : 1.2);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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: number = 0;
|
|
||||||
public fenster_flaeche_2: number = 0;
|
|
||||||
public fenster_art_2: number = 0;
|
|
||||||
public dachfenster_flaeche: number = 0;
|
|
||||||
public dachfenster_art: number = 0;
|
|
||||||
public haustuer_flaeche: number = 0;
|
|
||||||
public haustuer_art: number = 0;
|
|
||||||
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 gebaeude_uid?: string;
|
|
||||||
|
|
||||||
public constructor() {}
|
|
||||||
|
|
||||||
public static fromBase64(base64: string): VerbrauchsausweisGewerbe | null {
|
|
||||||
try {
|
|
||||||
const text = Buffer.from(base64, "base64");
|
|
||||||
|
|
||||||
const json = JSON.parse(text.toString());
|
|
||||||
return json;
|
|
||||||
} catch (e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public get primaerEnergieBedarf(): Promise<number> {
|
|
||||||
return (async () => {
|
|
||||||
const Endenergieverbrauch = await this.endEnergieVerbrauch;
|
|
||||||
|
|
||||||
const brennstoff_1 = getHeizwertfaktor(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1);
|
|
||||||
|
|
||||||
return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
public get endEnergieVerbrauch(): Promise<number> {
|
|
||||||
return (async () => {
|
|
||||||
const date = this.energieverbrauch_zeitraum;
|
|
||||||
const klimafaktoren = await getKlimafaktorenClient(
|
|
||||||
date,
|
|
||||||
this.objekt_plz
|
|
||||||
);
|
|
||||||
|
|
||||||
// Endenergieverbrauch
|
|
||||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
|
||||||
let brennstoff_1 = getHeizwertfaktor(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1);
|
|
||||||
let brennstoff_2 = getHeizwertfaktor(this.energietraeger_2, this.energietraeger_einheit_heizquelle_2);
|
|
||||||
|
|
||||||
let verbrauch_1_kwh =
|
|
||||||
(this.energieverbrauch_1_heizquelle_1 * brennstoff_1.umrechnungsfaktor)
|
|
||||||
let verbrauch_2_kwh =
|
|
||||||
(this.energieverbrauch_2_heizquelle_1 * brennstoff_1.umrechnungsfaktor)
|
|
||||||
let verbrauch_3_kwh =
|
|
||||||
(this.energieverbrauch_3_heizquelle_1 * brennstoff_1.umrechnungsfaktor)
|
|
||||||
let verbrauch_4_kwh =
|
|
||||||
(this.energieverbrauch_1_heizquelle_2 * brennstoff_2.umrechnungsfaktor)
|
|
||||||
let verbrauch_5_kwh =
|
|
||||||
(this.energieverbrauch_2_heizquelle_2 * brennstoff_2.umrechnungsfaktor)
|
|
||||||
let verbrauch_6_kwh =
|
|
||||||
(this.energieverbrauch_3_heizquelle_2 * brennstoff_2.umrechnungsfaktor)
|
|
||||||
|
|
||||||
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 (this.energiequelle_2_nutzung[3]) {
|
|
||||||
kuehlungsZuschlag = 6 * this.energetische_nutzfläche * 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
let anteil_heizung = 1 - this.anteil_warmwasser_1 / 100;
|
|
||||||
let anteil_warmwasser = this.anteil_warmwasser_1 / 100;
|
|
||||||
|
|
||||||
let Energieverbrauchskennwert =
|
|
||||||
(anteil_heizung *
|
|
||||||
(verbrauch_1_kwh + verbrauch_4_kwh) *
|
|
||||||
klimafaktoren[0] +
|
|
||||||
anteil_warmwasser * (verbrauch_1_kwh + verbrauch_4_kwh) +
|
|
||||||
anteil_heizung *
|
|
||||||
(verbrauch_2_kwh + verbrauch_5_kwh) *
|
|
||||||
klimafaktoren[1] +
|
|
||||||
anteil_warmwasser * (verbrauch_2_kwh + verbrauch_5_kwh) +
|
|
||||||
anteil_heizung *
|
|
||||||
(verbrauch_3_kwh + verbrauch_6_kwh) *
|
|
||||||
klimafaktoren[2] +
|
|
||||||
anteil_warmwasser * (verbrauch_3_kwh + verbrauch_6_kwh) +
|
|
||||||
warmwasserZuschlag +
|
|
||||||
leerstandsZuschlag +
|
|
||||||
kuehlungsZuschlag) /
|
|
||||||
3 /
|
|
||||||
this.energetische_nutzfläche;
|
|
||||||
|
|
||||||
|
|
||||||
return Energieverbrauchskennwert;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
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
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import { getKlimafaktoren } from "#lib/Klimafaktoren";
|
|
||||||
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
|
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
|
||||||
import {
|
import {
|
||||||
GebaeudeStammdaten,
|
GebaeudeStammdaten,
|
||||||
VerbrauchsausweisWohnen,
|
VerbrauchsausweisWohnen,
|
||||||
} from "@ibcornelsen/database";
|
} from "@ibcornelsen/database";
|
||||||
|
import moment from "moment";
|
||||||
|
import trpc from "src/trpc";
|
||||||
|
|
||||||
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
|
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
|
||||||
ausweis: VerbrauchsausweisWohnen & {
|
ausweis: VerbrauchsausweisWohnen & {
|
||||||
@@ -23,11 +24,16 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
|||||||
gebaeude_stammdaten: GebaeudeStammdaten;
|
gebaeude_stammdaten: GebaeudeStammdaten;
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
const date = ausweis.startdatum;
|
if (!ausweis.gebaeude_stammdaten.plz || !ausweis.startdatum) {
|
||||||
const klimafaktoren = await getKlimafaktoren(
|
return null
|
||||||
date,
|
}
|
||||||
ausweis.gebaeude_stammdaten.plz
|
|
||||||
);
|
const klimafaktoren = await trpc.klimafaktoren.query({
|
||||||
|
plz: ausweis.gebaeude_stammdaten.plz,
|
||||||
|
genauigkeit: "years",
|
||||||
|
startdatum: ausweis.startdatum,
|
||||||
|
enddatum: moment(ausweis.startdatum).add(2, "years").toDate()
|
||||||
|
})
|
||||||
|
|
||||||
// Endenergieverbrauch
|
// Endenergieverbrauch
|
||||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
||||||
@@ -104,7 +110,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let durchschnittsKlimafaktor =
|
let durchschnittsKlimafaktor =
|
||||||
(klimafaktoren[0] + klimafaktoren[1] + klimafaktoren[2]) / 3 || 1;
|
(klimafaktoren[0].klimafaktor + klimafaktoren[1].klimafaktor + klimafaktoren[2].klimafaktor) / 3 || 1;
|
||||||
|
|
||||||
let energieVerbrauchHeizungBereinigt_1 =
|
let energieVerbrauchHeizungBereinigt_1 =
|
||||||
energieVerbrauchHeizung_1 * durchschnittsKlimafaktor;
|
energieVerbrauchHeizung_1 * durchschnittsKlimafaktor;
|
||||||
|
|||||||
@@ -1,56 +1,22 @@
|
|||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { memoize } from "./Memoization";
|
import { memoize } from "./Memoization";
|
||||||
import { prisma } from "@ibcornelsen/database";
|
import trpc from "src/trpc";
|
||||||
import { l } from "astro-i18n";
|
|
||||||
|
|
||||||
export const getKlimafaktorenClient = memoize<Promise<[number, number, number]>>(async (date: Date, plz: string) => {
|
export const getKlimafaktoren = memoize(async (date: Date, plz: string) => {
|
||||||
if (!plz || !date) {
|
if (!plz || !date) {
|
||||||
return [0, 0, 0];
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch(`/api/klimafaktor?date=${moment(date).format("YYYY-MM-DD")}&accuracy=years&zip=${plz}`, {
|
const response = await trpc.klimafaktoren.query({
|
||||||
method: "GET",
|
plz,
|
||||||
headers: {
|
genauigkeit: "years",
|
||||||
"Content-Type": "application/json"
|
startdatum: date,
|
||||||
}
|
enddatum: moment(date).add(2, "years").toDate()
|
||||||
});
|
})
|
||||||
const json = await response.json();
|
|
||||||
|
|
||||||
if (!json.success) {
|
if (!response) {
|
||||||
return [0, 0, 0];
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Object.values(json.data) as [number, number, number];
|
return response;
|
||||||
});
|
});
|
||||||
|
|
||||||
export const getKlimafaktorenServer = memoize(async (date: Date, plz: string) => {
|
|
||||||
if (!plz || !date) {
|
|
||||||
return [0, 0, 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
const klimafaktoren = await prisma.klimafaktoren.findMany({
|
|
||||||
where: {
|
|
||||||
plz,
|
|
||||||
month: moment(date).month(),
|
|
||||||
OR: [
|
|
||||||
{
|
|
||||||
year: moment(date).year()
|
|
||||||
},
|
|
||||||
{
|
|
||||||
year: moment(date).year() + 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
year: moment(date).year() + 2
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (klimafaktoren.length === 0) {
|
|
||||||
return [0, 0, 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
return klimafaktoren.map(klimafaktor => klimafaktor.klimafaktor) as [number, number, number];
|
|
||||||
});
|
|
||||||
|
|
||||||
export const getKlimafaktoren = typeof window === "undefined" ? getKlimafaktorenServer : getKlimafaktorenClient;
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
import moment, { Moment } from "moment";
|
|
||||||
import { Klimafaktoren, prisma } from "@ibcornelsen/database";
|
|
||||||
|
|
||||||
export async function getClimateFactor(
|
|
||||||
dates: Moment[],
|
|
||||||
plz: string
|
|
||||||
): Promise<Klimafaktoren[] | null> {
|
|
||||||
if (dates.length == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plz.length !== 5 && plz.length !== 4) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = await prisma.klimafaktoren.findMany({
|
|
||||||
where: {
|
|
||||||
plz: plz,
|
|
||||||
month: dates[0].month(),
|
|
||||||
OR: dates.map((date) => {
|
|
||||||
return {
|
|
||||||
year: date.year(),
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
347
src/lib/XML/AusweisBerechnungen2016.ts
Normal file
347
src/lib/XML/AusweisBerechnungen2016.ts
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
import { GebaeudeStammdaten, VerbrauchsausweisWohnen, prisma } from "@ibcornelsen/database";
|
||||||
|
import { getEmpfehlungen } from "./getEmpfehlungen";
|
||||||
|
|
||||||
|
export class AusweisBerechnungen2016 {
|
||||||
|
private ausweis: VerbrauchsausweisWohnen;
|
||||||
|
private gebaeude: GebaeudeStammdaten;
|
||||||
|
private _berechParameter: any;
|
||||||
|
|
||||||
|
public constructor(ausweis: VerbrauchsausweisWohnen, gebaeude: GebaeudeStammdaten, berechnungen: any) {
|
||||||
|
this.ausweis = ausweis;
|
||||||
|
this.gebaeude = gebaeude
|
||||||
|
this._berechParameter = berechnungen;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getAusweisart() {
|
||||||
|
switch (this.ausweis.ausweisart.toLowerCase()) {
|
||||||
|
case ('va'):
|
||||||
|
return {'typ' : 'Wohngebaeude', 'art' : 'Verbrauchsausweis Wohngebäude', 'kuerzel' : 'va'};
|
||||||
|
case ('ba'):
|
||||||
|
return {'typ' : 'Wohngebaeude', 'art' : 'Bedarfsausweis Wohngebäude', 'kuerzel' : 'ba'};
|
||||||
|
case ('vanw'):
|
||||||
|
return {
|
||||||
|
'typ' : 'Nichtwohngebaeude',
|
||||||
|
'art' : 'Verbrauchsausweis Nichtwohngebäude',
|
||||||
|
'kuerzel' : 'vanw'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public altersKlasse(art: "baujahr_gebaeude" | "baujahr_heizung") {
|
||||||
|
const year = this.gebaeude[art][0] || 0;
|
||||||
|
switch (true) {
|
||||||
|
case (year <= 1918):
|
||||||
|
return 'bis 1918';
|
||||||
|
|
||||||
|
case (year > 1918 && year <= 1948):
|
||||||
|
return '1919...1948';
|
||||||
|
|
||||||
|
case (year > 1948 && year <= 1957):
|
||||||
|
return '1949...1957';
|
||||||
|
|
||||||
|
case (year > 1957 && year <= 1968):
|
||||||
|
return '1958...1968';
|
||||||
|
|
||||||
|
case (year > 1968 && year <= 1978):
|
||||||
|
return '1969...1978';
|
||||||
|
|
||||||
|
case (year > 1978 && year <= 1982):
|
||||||
|
return '1979...1982';
|
||||||
|
|
||||||
|
case (year > 1982 && year <= 1994):
|
||||||
|
return '1983...1994';
|
||||||
|
|
||||||
|
case (year > 1994 && year <= 2002):
|
||||||
|
return '1995...2002';
|
||||||
|
|
||||||
|
case (year > 2002 && year <= 2007):
|
||||||
|
return '2003...2007';
|
||||||
|
|
||||||
|
case (year > 2007 && year <= 2015):
|
||||||
|
return '2008...2015';
|
||||||
|
|
||||||
|
case (year > 2015):
|
||||||
|
return 'ab 2016';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return '';
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getGebaeudeTeil() {
|
||||||
|
if (this.gebaeude.gebaeudeteil == "Gesamtgebäude") {
|
||||||
|
return "Ganzes Gebäude";
|
||||||
|
} else if (this.gebaeude.gebaeudeteil == "Wohnen" && this.ausweis.ausweisart == "VANW") {
|
||||||
|
return "Teil des Wohngebäudes";
|
||||||
|
} else {
|
||||||
|
return "Teil des Nichtwohngebäudes";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getGebaeudeTyp(getAnbaugrad = false) {
|
||||||
|
|
||||||
|
let geTypes = {
|
||||||
|
'Einfamilienhaus' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'freistehend'
|
||||||
|
},
|
||||||
|
'Freistehendes Einfamilienhaus' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'freistehend'
|
||||||
|
},
|
||||||
|
'Freistehendes Zweifamilienhaus' : {
|
||||||
|
'typ' : "Zweifamilienhaus",
|
||||||
|
'anbaugrad' : 'freistehend'
|
||||||
|
},
|
||||||
|
'Doppelhaushälfte' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'einseitig angebaut'
|
||||||
|
},
|
||||||
|
'Reihenendhaus' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'einseitig angebaut'
|
||||||
|
},
|
||||||
|
'Reihenmittelhaus' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'zweiseitig angebaut'
|
||||||
|
},
|
||||||
|
'Mehrfamilienhaus' : {
|
||||||
|
'typ' : "Mehrfamilienhaus",
|
||||||
|
'anbaugrad' : 'freistehend'
|
||||||
|
},
|
||||||
|
'Wohn- und Geschäftshaus' : {
|
||||||
|
'typ' : "Wohnteil gemischt genutztes Gebäude",
|
||||||
|
'anbaugrad' : 'zweiseitig angebaut'
|
||||||
|
},
|
||||||
|
'Stadthausdrittel' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'zweiseitig angebaut'
|
||||||
|
},
|
||||||
|
'Bungalow' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'freistehend'
|
||||||
|
},
|
||||||
|
'Winkelbungalow' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'freistehend'
|
||||||
|
},
|
||||||
|
'Atrium-Bungalow' : {
|
||||||
|
'typ' : "Einfamilienhaus",
|
||||||
|
'anbaugrad' : 'freistehend'
|
||||||
|
},
|
||||||
|
};
|
||||||
|
if (getAnbaugrad) {
|
||||||
|
return geTypes[this.gebaeude.gebaeudetyp]['anbaugrad'];
|
||||||
|
}
|
||||||
|
return geTypes[this.gebaeude.gebaeudetyp]['typ'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public getEnergietraegerBezeichnung(bezeichnung: string, einheit: string) {
|
||||||
|
let bez = bezeichnung.trim() + einheit.trim();
|
||||||
|
let retArr = {
|
||||||
|
'Heizöl ELl' : "Heizöl EL in Liter",
|
||||||
|
'Heizöl ELkWh' : "Heizöl EL in kWh Brennwert",
|
||||||
|
'HeizölkWh' : "Heizöl EL in kWh Brennwert",
|
||||||
|
3 : "Heizöl-Bioöl-Mischung in Liter",
|
||||||
|
4 : "Heizöl-Bioöl-Mischung in kWh Brennwert",
|
||||||
|
5 : "Heizöl-Bioöl-Mischung in kWh Brennwert",
|
||||||
|
6 : "Bioöl in Liter",
|
||||||
|
7 : "Bioöl in kWh Brennwert",
|
||||||
|
8 : "Bioöl in kWh Brennwert",
|
||||||
|
'Erdgas Hm³' : "Erdgas H in m³",
|
||||||
|
'Erdgas HkWh' : "Erdgas H in kWh Brennwert",
|
||||||
|
'ErdgaskWh' : "Erdgas H in kWh Brennwert",
|
||||||
|
12 : "Erdgas-Biogas-Mischung in m³",
|
||||||
|
13 : "Erdgas-Biogas-Mischung in kWh Brennwert",
|
||||||
|
14 : "Erdgas-Biogas-Mischung in kWh Brennwert",
|
||||||
|
15 : "Biogas in m³",
|
||||||
|
16 : "Biogas in kWh Brennwert",
|
||||||
|
17 : "Biogas in kWh Brennwert",
|
||||||
|
'Flüssiggasm³' : "Flüssiggas in m³ gasförmig",
|
||||||
|
'Flüssiggasl' : "Flüssiggas in Liter flüssig",
|
||||||
|
'Flüssiggaskg' : "Flüssiggas in kg",
|
||||||
|
'FlüssiggaskWh' : "Flüssiggas in kWh Brennwert",
|
||||||
|
22 : "Flüssiggas in kWh Brennwert",
|
||||||
|
23 : "Steinkohle in kg",
|
||||||
|
24 : "Steinkohle in kWh Brennwert",
|
||||||
|
'Kokskg' : "Koks in kg",
|
||||||
|
'KokskWh' : "Koks in kWh Brennwert",
|
||||||
|
'Braunkohlekg' : "Braunkohle in kg",
|
||||||
|
'BraunkohlekWh' : "Braunkohle in kWh Brennwert",
|
||||||
|
'Brennholzm³' : "Holz in Raummeter",
|
||||||
|
'BrennholzSRm' : "Holz in Schüttraummeter",
|
||||||
|
'Brennholzkg' : "Holz in kg",
|
||||||
|
'BrennholzkWh' : "Holz in kWh Brennwert",
|
||||||
|
32 : "Holz in kWh Brennwert",
|
||||||
|
'HolzhackschnitzelSRm' : "Holz in Schüttraummeter",
|
||||||
|
'Holzhackschnitzelkg' : "Holz in kg",
|
||||||
|
'HolzhackschnitzelkWh' : "Holz in kWh Brennwert",
|
||||||
|
36 : "Holz in kWh Brennwert",
|
||||||
|
'Holz-PelletsSRm' : "Holz in Schüttraummeter",
|
||||||
|
'Holz-Pelletskg' : "Holz in kg",
|
||||||
|
'Holz-PelletskWh' : "Holz in kWh Brennwert",
|
||||||
|
40 : "Holz in kWh Brennwert",
|
||||||
|
41 : "Wärme aus lokalem BHKW in kWh",
|
||||||
|
'Nahwärme HKW FBkWh' : "Nah-/Fernwärme aus Heizwerken - fossiler Brennstoff in kWh",
|
||||||
|
'Fernwärme HKW FBkWh' : "Nah-/Fernwärme aus Heizwerken - fossiler Brennstoff in kWh",
|
||||||
|
'StrommixkWh' : "allgemeiner Strommix in kWh",
|
||||||
|
'Erdgas LkWh' : "Erdgas H in kWh Brennwert",
|
||||||
|
'Erdgas Lm³' : "Erdgas H in m³",
|
||||||
|
'Erdgasm³' : "Erdgas H in m³",
|
||||||
|
'Heizöll' : "Heizöl EL in Liter",
|
||||||
|
'Nahwärme HKW EBkWh' : "Nah-/Fernwärme aus Heizwerken - erneuerbarer Brennstoff in kWh",
|
||||||
|
'Fernwärme HKW EBkWh' : "Nah-/Fernwärme aus Heizwerken - erneuerbarer Brennstoff in kWh",
|
||||||
|
'Nahwärme KWK EBkWh' : "Nah-/Fernwärme aus KWK - erneuerbarer Brennstoff in kWh",
|
||||||
|
'Fernwärme KWK EBkWh' : "Nah-/Fernwärme aus KWK - erneuerbarer Brennstoff in kWh",
|
||||||
|
'Nahwärme KWK FBkWh' : "Nah-/Fernwärme aus KWK - fossiler Brennstoff in kWh",
|
||||||
|
'Fernwärme KWK FBkWh' : "Nah-/Fernwärme aus KWK - fossiler Brennstoff in kWh"
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
return retArr[bez];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public getEmpfehlungen() {
|
||||||
|
let empfehlungen = getEmpfehlungen(this.ausweis, this.gebaeude);
|
||||||
|
|
||||||
|
if (empfehlungen.length > 0) {
|
||||||
|
return 'http://www.bbsr-energieeinsparung.de/EnEVPortal/DE/Home/home_node.html';
|
||||||
|
} else {
|
||||||
|
return 'Angabe hier nicht relevant';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getLueftungsKonzept() {
|
||||||
|
let lueftungsKonzept: Record<string, string> = {}
|
||||||
|
lueftungsKonzept['fensterlueftung'] = (this.gebaeude.lueftung == "Fensterlüftung")
|
||||||
|
? "true" : "false";
|
||||||
|
|
||||||
|
lueftungsKonzept['schachtlueftung'] = (this.gebaeude.lueftung == "Schachtlüftung")
|
||||||
|
? "true" : "false";
|
||||||
|
|
||||||
|
lueftungsKonzept['ohneRueckgewinnung'] = (this.gebaeude.lueftung
|
||||||
|
== "Lüftungsanlage ohne Wärmerückgewinnung") ? "true" : "false";
|
||||||
|
|
||||||
|
lueftungsKonzept['mitRueckgewinnung'] = (this.gebaeude.lueftung
|
||||||
|
== "Lüftungsanlage mit Wärmerückgewinnung") ? "true" : "false";
|
||||||
|
|
||||||
|
return lueftungsKonzept;
|
||||||
|
}
|
||||||
|
|
||||||
|
public kellerBeheizt() {
|
||||||
|
return this.ausweis.keller_beheizt ? "true" : "false";
|
||||||
|
}
|
||||||
|
|
||||||
|
public anlass() {
|
||||||
|
|
||||||
|
let anlass = '';
|
||||||
|
|
||||||
|
if (this.ausweis.ausstellgrund == "Neubau") {
|
||||||
|
anlass = 'Neubau';
|
||||||
|
} else if (this.ausweis.ausstellgrund == "Modernisierung") {
|
||||||
|
anlass = 'Modernisierung-Erweiterung';
|
||||||
|
} else if (this.ausweis.ausstellgrund == "Vermietung") {
|
||||||
|
anlass = 'Vermietung-Verkauf';
|
||||||
|
} else if (this.ausweis.ausstellgrund == "Aushang") {
|
||||||
|
anlass = 'Aushangpflicht';
|
||||||
|
} else {
|
||||||
|
anlass = 'Sonstiges';
|
||||||
|
}
|
||||||
|
|
||||||
|
return anlass;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getOrt() {
|
||||||
|
if (!this.gebaeude.plz) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await prisma.postleitzahlen.findUnique({
|
||||||
|
where: {
|
||||||
|
plz: this.gebaeude.plz
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return result?.bundesland || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public getBerechAusweis() {
|
||||||
|
|
||||||
|
return this._berechParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* function to check if several values are filled
|
||||||
|
*/
|
||||||
|
public emptyParams() {
|
||||||
|
let emptyParams: Record<string, string> = {};
|
||||||
|
emptyParams['wirdGekuehlt'] = this.ausweis.wird_gekuehlt ? 'true' : 'false';
|
||||||
|
|
||||||
|
emptyParams['datenErhebungEigentuemer'] = "true";
|
||||||
|
|
||||||
|
emptyParams['datenErhebungAussteller'] = "false";
|
||||||
|
|
||||||
|
emptyParams['nwheizung'] = this.gebaeude.zentralheizung
|
||||||
|
? 'true' : 'false';
|
||||||
|
emptyParams['nwwarmwasser'] = this.gebaeude.einzelofen
|
||||||
|
? 'true' : 'false';
|
||||||
|
emptyParams['nwlueftung'] = this.gebaeude.durchlauf_erhitzer
|
||||||
|
? 'true' : 'false';
|
||||||
|
emptyParams['nwbeleuchtung'] = this.gebaeude.standard_kessel
|
||||||
|
? 'true' : 'false';
|
||||||
|
emptyParams['nwkuehlung'] = this.gebaeude.solarsystem_warmwasser
|
||||||
|
? 'true' : 'false';
|
||||||
|
//emptyParams['nwsonstiges'] = this.gebaeude.nwsonstiges
|
||||||
|
// ? 'true' : 'false';
|
||||||
|
|
||||||
|
return emptyParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public getBauEmpfehlungen() {
|
||||||
|
let empfehlungen = getEmpfehlungen(this.ausweis, this.gebaeude);
|
||||||
|
|
||||||
|
return empfehlungen.map(empfehlung => {
|
||||||
|
return {
|
||||||
|
"anlagenteil" : empfehlung["anlagenteil"],
|
||||||
|
"massnahme" : empfehlung["description"]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public getEnergieEffizienzklasse() {
|
||||||
|
|
||||||
|
let param = this._berechParameter.endEnergieVerbrauchGesamt;
|
||||||
|
|
||||||
|
if (param < 30) {
|
||||||
|
return 'A+';
|
||||||
|
}else if (param < 50) {
|
||||||
|
return 'A';
|
||||||
|
}else if (param < 75) {
|
||||||
|
return 'B';
|
||||||
|
}else if (param < 100) {
|
||||||
|
return 'C';
|
||||||
|
}else if (param < 130) {
|
||||||
|
return 'D';
|
||||||
|
}else if (param < 160) {
|
||||||
|
return 'E';
|
||||||
|
}else if (param < 200) {
|
||||||
|
return 'F';
|
||||||
|
}else if (param < 250) {
|
||||||
|
return 'G';
|
||||||
|
}else if (param >= 250) {
|
||||||
|
return 'H';
|
||||||
|
}
|
||||||
|
return this._berechParameter.endEnergieVerbrauchGesamt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getAusweisParameter() {
|
||||||
|
return this.ausweis;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,350 @@
|
|||||||
|
import {
|
||||||
|
endEnergieVerbrauchVerbrauchsausweis_2016,
|
||||||
|
energetischeNutzflaecheVerbrauchsausweisWohnen_2016,
|
||||||
|
} from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
|
||||||
|
import { getKlimafaktoren } from "#lib/Klimafaktoren";
|
||||||
|
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
|
||||||
|
import {
|
||||||
|
GebaeudeStammdaten,
|
||||||
|
VerbrauchsausweisWohnen,
|
||||||
|
prisma,
|
||||||
|
} from "@ibcornelsen/database";
|
||||||
|
import { AusweisBerechnungen2016 } from "../AusweisBerechnungen2016";
|
||||||
|
import moment from "moment";
|
||||||
|
|
||||||
|
export async function xmlVerbrauchsausweisWohnen_2016(
|
||||||
|
ausweis: VerbrauchsausweisWohnen & {
|
||||||
|
gebaeude_stammdaten: GebaeudeStammdaten;
|
||||||
|
}
|
||||||
|
): Promise<string> {
|
||||||
|
const gebaeude = ausweis.gebaeude_stammdaten;
|
||||||
|
|
||||||
|
const bundesland = await prisma.postleitzahlen.findUnique({
|
||||||
|
where: {
|
||||||
|
plz: gebaeude.plz as string,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// Wir müssen die Postleitzahl unkenntlich machen.
|
||||||
|
let postleitzahl = gebaeude.plz?.substring(0, 3) + "XX";
|
||||||
|
|
||||||
|
const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis);
|
||||||
|
const berechnungen = new AusweisBerechnungen2016(
|
||||||
|
ausweis,
|
||||||
|
ausweis.gebaeude_stammdaten,
|
||||||
|
result
|
||||||
|
);
|
||||||
|
const klimafaktoren = await getKlimafaktoren(
|
||||||
|
ausweis.startdatum,
|
||||||
|
gebaeude.plz
|
||||||
|
);
|
||||||
|
|
||||||
|
// Berechnungen
|
||||||
|
let bauAltersKlasseAnlage = berechnungen.altersKlasse("baujahr_heizung");
|
||||||
|
let bauAltersKlasseGebaeude = berechnungen.altersKlasse("baujahr_gebaeude");
|
||||||
|
|
||||||
|
let kellerBeheizt = ausweis.keller_beheizt ? "true" : "false";
|
||||||
|
|
||||||
|
let Zeitraum1von = moment(ausweis.startdatum);
|
||||||
|
let Zeitraum1bis = Zeitraum1von.clone()
|
||||||
|
.add("12", "month")
|
||||||
|
.format("YYYY-MM-DD");
|
||||||
|
let Zeitraum2von = Zeitraum1von.clone()
|
||||||
|
.add("12", "month")
|
||||||
|
.add("1", "day")
|
||||||
|
.format("YYYY-MM-DD");
|
||||||
|
let Zeitraum2bis = Zeitraum1von.clone()
|
||||||
|
.add("24", "month")
|
||||||
|
.format("YYYY-MM-DD");
|
||||||
|
let Zeitraum3von = Zeitraum1von.clone()
|
||||||
|
.add("24", "month")
|
||||||
|
.add("1", "day")
|
||||||
|
.format("YYYY-MM-DD");
|
||||||
|
let Zeitraum3bis = Zeitraum1von.clone()
|
||||||
|
.add("36", "month")
|
||||||
|
.format("YYYY-MM-DD");
|
||||||
|
|
||||||
|
let lueftungsKonzept = berechnungen.getLueftungsKonzept();
|
||||||
|
let gebaeudeTyp = berechnungen.getGebaeudeTyp();
|
||||||
|
|
||||||
|
let erstellungsdatum = moment(ausweis.erstellungsdatum).format(
|
||||||
|
"YYYY-MM-DD"
|
||||||
|
);
|
||||||
|
|
||||||
|
let empfehlungen = berechnungen.getBauEmpfehlungen();
|
||||||
|
let empfehlungenMoeglich = empfehlungen.length > 0 ? "true" : "false";
|
||||||
|
let energieeffizienzKlasse = berechnungen.getEnergieEffizienzklasse();
|
||||||
|
|
||||||
|
let keineNutzungWarmwasser = ausweis.warmwasser_enthalten
|
||||||
|
? "false"
|
||||||
|
: "true";
|
||||||
|
|
||||||
|
let heizwertfaktor_1 = getHeizwertfaktor(
|
||||||
|
ausweis.brennstoff_1,
|
||||||
|
ausweis.einheit_1
|
||||||
|
);
|
||||||
|
let heizwertfaktor_2 = getHeizwertfaktor(
|
||||||
|
ausweis.brennstoff_2,
|
||||||
|
ausweis.einheit_2
|
||||||
|
);
|
||||||
|
|
||||||
|
let warmWasserErmittlung =
|
||||||
|
(ausweis.anteil_warmwasser_1 || 0) > 0
|
||||||
|
? "direkter Messwert Wärmemenge"
|
||||||
|
: "Rechenwert nach Heizkostenverordnung (Wohngebäude)";
|
||||||
|
let warmWasserErmittlung_2 =
|
||||||
|
(ausweis.anteil_warmwasser_2 || 0) > 0
|
||||||
|
? "direkter Messwert Wärmemenge"
|
||||||
|
: "Rechenwert nach Heizkostenverordnung (Wohngebäude)";
|
||||||
|
if (!ausweis.warmwasser_enthalten) {
|
||||||
|
warmWasserErmittlung =
|
||||||
|
"Pauschale für dezentrale Warmwasserbereitung (Wohngebäude)";
|
||||||
|
warmWasserErmittlung_2 =
|
||||||
|
"Pauschale für dezentrale Warmwasserbereitung (Wohngebäude)";
|
||||||
|
}
|
||||||
|
|
||||||
|
let anlageKuehlung = ausweis.wird_gekuehlt ? "true" : "false";
|
||||||
|
|
||||||
|
let verwalt = "";
|
||||||
|
let artalt = "";
|
||||||
|
if (ausweis.alternative_heizung) {
|
||||||
|
verwalt += "Heizung ";
|
||||||
|
}
|
||||||
|
if (ausweis.alternative_warmwasser) {
|
||||||
|
verwalt += "Warmwasser ";
|
||||||
|
}
|
||||||
|
if (ausweis.alternative_lueftung) {
|
||||||
|
verwalt += "Lüftung ";
|
||||||
|
}
|
||||||
|
if (ausweis.alternative_kuehlung) {
|
||||||
|
verwalt += "Kühlung ";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gebaeude.solarsystem_warmwasser) {
|
||||||
|
artalt += "Solar ";
|
||||||
|
}
|
||||||
|
if (gebaeude.waermepumpe) {
|
||||||
|
artalt += "Erdwärme oder Umgebungswärme ";
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
ausweis.brennstoff_2 == "Holz-Pellets" ||
|
||||||
|
ausweis.brennstoff_2 == "Brennholz" ||
|
||||||
|
ausweis.brennstoff_2 == "Holzhackschnitzel" ||
|
||||||
|
ausweis.brennstoff_2 == "Nah/Fernwärme KWK EB" ||
|
||||||
|
ausweis.brennstoff_2 == "Nah/Fernwärme HKW EB" ||
|
||||||
|
ausweis.brennstoff_1 == "Holz-Pellets" ||
|
||||||
|
ausweis.brennstoff_1 == "Brennholz" ||
|
||||||
|
ausweis.brennstoff_1 == "Holzhackschnitzel" ||
|
||||||
|
ausweis.brennstoff_1 == "Nah/Fernwärme KWK EB" ||
|
||||||
|
ausweis.brennstoff_1 == "Nah/Fernwärme HKW EB"
|
||||||
|
) {
|
||||||
|
artalt += "Nachwachsend ";
|
||||||
|
}
|
||||||
|
|
||||||
|
artalt = artalt || "keine";
|
||||||
|
verwalt = verwalt || "keine";
|
||||||
|
|
||||||
|
let gebaeudeTeil = berechnungen.getGebaeudeTeil();
|
||||||
|
|
||||||
|
const energetischeNutzflaeche =
|
||||||
|
energetischeNutzflaecheVerbrauchsausweisWohnen_2016(ausweis);
|
||||||
|
|
||||||
|
let flaecheGekuehlt = ausweis.wird_gekuehlt ? energetischeNutzflaeche : 0;
|
||||||
|
|
||||||
|
let endEnergieVerbrauchGesamt = Math.round(
|
||||||
|
result.endEnergieVerbrauchGesamt
|
||||||
|
);
|
||||||
|
let primaerEnergieVerbrauchGesamt = Math.round(
|
||||||
|
result.primaerEnergieVerbrauchGesamt
|
||||||
|
);
|
||||||
|
|
||||||
|
let energieTraeger = berechnungen.getEnergietraegerBezeichnung(
|
||||||
|
ausweis.brennstoff_1,
|
||||||
|
ausweis.einheit_1
|
||||||
|
);
|
||||||
|
let energieTraeger_2 = berechnungen.getEnergietraegerBezeichnung(
|
||||||
|
ausweis.brennstoff_2,
|
||||||
|
ausweis.einheit_2
|
||||||
|
);
|
||||||
|
|
||||||
|
let warmwasserZuschlag = Math.round(result.energieVerbrauchWarmwasser_1);
|
||||||
|
|
||||||
|
let leerstandsZuschlagHeizung = Math.round(
|
||||||
|
result.leerstandsZuschlagHeizung
|
||||||
|
);
|
||||||
|
let Aussteller_ID_DIB = "jens.cornelsen@ib-cornelsen.de";
|
||||||
|
let Aussteller_PWD_DIBT = "62465E79F6A61F31C4DCA9E2AF788DD3";
|
||||||
|
|
||||||
|
let energieVerbrauch_1 = Math.round(result.verbrauch_1_kwh);
|
||||||
|
let energieVerbrauch_2 = Math.round(result.verbrauch_2_kwh);
|
||||||
|
let energieVerbrauch_3 = Math.round(result.verbrauch_3_kwh);
|
||||||
|
|
||||||
|
let xml = `<ZusatzdatenErfassung xmlns='http://energieausweis.dibt.de/WebServiceEnergie/DibtEnergieAusweisService'>
|
||||||
|
<doc>
|
||||||
|
<n1:EnEV-Energieausweis xmlns:n1=\"https://energieausweis.dibt.de/schema/Kontrollsystem_Versionsstand_2016-06-30.xsd\">
|
||||||
|
<n1:Energieausweis-Daten EnEV-Version=\"2013\" Rechtsstand=\"2016-01-01\">
|
||||||
|
<n1:Registriernummer>${ausweis.registriernummer}</n1:Registriernummer>
|
||||||
|
<n1:Ausstellungsdatum>${erstellungsdatum}</n1:Ausstellungsdatum>
|
||||||
|
<n1:Bundesland>${bundesland?.bundesland}</n1:Bundesland>
|
||||||
|
<n1:Postleitzahl>${postleitzahl}</n1:Postleitzahl>
|
||||||
|
<n1:Gebaeudeteil>${gebaeudeTeil}</n1:Gebaeudeteil>
|
||||||
|
<n1:Baujahr-Gebaeude>${gebaeude.baujahr_gebaeude}</n1:Baujahr-Gebaeude>
|
||||||
|
<n1:Altersklasse-Gebaeude>${bauAltersKlasseGebaeude}</n1:Altersklasse-Gebaeude>
|
||||||
|
<n1:Baujahr-Waermeerzeuger>${gebaeude.baujahr_heizung}</n1:Baujahr-Waermeerzeuger>
|
||||||
|
<n1:Altersklasse-Waermeerzeuger>${bauAltersKlasseAnlage}</n1:Altersklasse-Waermeerzeuger>
|
||||||
|
<n1:wesentliche-Energietraeger>${energieTraeger}</n1:wesentliche-Energietraeger>
|
||||||
|
<n1:Erneuerbare-Art>${artalt}</n1:Erneuerbare-Art>
|
||||||
|
<n1:Erneuerbare-Verwendung>${verwalt}</n1:Erneuerbare-Verwendung>
|
||||||
|
<n1:Lueftungsart-Fensterlueftung>${lueftungsKonzept["fensterlueftung"]}</n1:Lueftungsart-Fensterlueftung>
|
||||||
|
<n1:Lueftungsart-Schachtlueftung>${lueftungsKonzept["schachtlueftung"]}</n1:Lueftungsart-Schachtlueftung>
|
||||||
|
<n1:Lueftungsart-Anlage-o-WRG>${lueftungsKonzept["ohneRueckgewinnung"]}</n1:Lueftungsart-Anlage-o-WRG>
|
||||||
|
<n1:Lueftungsart-Anlage-m-WRG>${lueftungsKonzept["mitRueckgewinnung"]}</n1:Lueftungsart-Anlage-m-WRG>
|
||||||
|
<n1:Anlage-zur-Kuehlung>${anlageKuehlung}</n1:Anlage-zur-Kuehlung>
|
||||||
|
<n1:Ausstellungsanlass>{berechnungen.anlass()}</n1:Ausstellungsanlass>
|
||||||
|
<n1:Datenerhebung-Aussteller>false</n1:Datenerhebung-Aussteller>
|
||||||
|
<n1:Datenerhebung-Eigentuemer>true</n1:Datenerhebung-Eigentuemer>
|
||||||
|
<n1:Wohngebaeude>
|
||||||
|
<n1:Gebaeudetyp>${gebaeudeTyp}</n1:Gebaeudetyp>
|
||||||
|
<n1:Anzahl-Wohneinheiten>${gebaeude.einheiten}</n1:Anzahl-Wohneinheiten>
|
||||||
|
<n1:Gebaeudenutzflaeche>${energetischeNutzflaeche}</n1:Gebaeudenutzflaeche>
|
||||||
|
<n1:Verbrauchswerte>
|
||||||
|
<n1:Flaechenermittlung-AN-aus-Wohnflaeche>true</n1:Flaechenermittlung-AN-aus-Wohnflaeche>
|
||||||
|
<n1:Wohnflaeche>${gebaeude.flaeche}</n1:Wohnflaeche>
|
||||||
|
<n1:Keller-beheizt>${kellerBeheizt}</n1:Keller-beheizt>
|
||||||
|
<n1:Energietraeger>
|
||||||
|
<n1:Energietraeger-Verbrauch>${energieTraeger}</n1:Energietraeger-Verbrauch>
|
||||||
|
<n1:Unterer-Heizwert>${heizwertfaktor_1.umrechnungsfaktor}</n1:Unterer-Heizwert>
|
||||||
|
<n1:Primaerenergiefaktor>${heizwertfaktor_1.primaerenergiefaktor}</n1:Primaerenergiefaktor>
|
||||||
|
<n1:Zeitraum>
|
||||||
|
<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum1bis}</n1:Enddatum>
|
||||||
|
<n1:Verbrauchte-Menge>${ausweis.verbrauch_1}</n1:Verbrauchte-Menge>
|
||||||
|
<n1:Energieverbrauch>${energieVerbrauch_1}</n1:Energieverbrauch>
|
||||||
|
<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_1}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
|
||||||
|
<n1:Warmwasserwertermittlung>${warmWasserErmittlung}</n1:Warmwasserwertermittlung>
|
||||||
|
<n1:Klimafaktor>${klimafaktoren[0]}</n1:Klimafaktor>
|
||||||
|
</n1:Zeitraum>
|
||||||
|
<n1:Zeitraum>
|
||||||
|
<n1:Startdatum>${Zeitraum2von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum2bis}</n1:Enddatum>
|
||||||
|
<n1:Verbrauchte-Menge>${ausweis.verbrauch_2}</n1:Verbrauchte-Menge>
|
||||||
|
<n1:Energieverbrauch>${energieVerbrauch_2}</n1:Energieverbrauch>
|
||||||
|
<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_1}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
|
||||||
|
<n1:Warmwasserwertermittlung>${warmWasserErmittlung}</n1:Warmwasserwertermittlung>
|
||||||
|
<n1:Klimafaktor>${klimafaktoren[1]}</n1:Klimafaktor>
|
||||||
|
</n1:Zeitraum>
|
||||||
|
<n1:Zeitraum>
|
||||||
|
<n1:Startdatum>${Zeitraum3von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
|
||||||
|
<n1:Verbrauchte-Menge>${ausweis.verbrauch_3}</n1:Verbrauchte-Menge>
|
||||||
|
<n1:Energieverbrauch>${energieVerbrauch_3}</n1:Energieverbrauch>
|
||||||
|
<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_1}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
|
||||||
|
<n1:Warmwasserwertermittlung>${warmWasserErmittlung}</n1:Warmwasserwertermittlung>
|
||||||
|
<n1:Klimafaktor>${klimafaktoren[2]}</n1:Klimafaktor>
|
||||||
|
</n1:Zeitraum>
|
||||||
|
</n1:Energietraeger>`;
|
||||||
|
|
||||||
|
if (ausweis.zusaetzliche_heizquelle) {
|
||||||
|
xml += `<n1:Energietraeger>
|
||||||
|
<n1:Energietraeger-Verbrauch>${energieTraeger_2}</n1:Energietraeger-Verbrauch>
|
||||||
|
<n1:Unterer-Heizwert>${heizwertfaktor_2.umrechnungsfaktor}</n1:Unterer-Heizwert>
|
||||||
|
<n1:Primaerenergiefaktor>${heizwertfaktor_2.primaerenergiefaktor}</n1:Primaerenergiefaktor>
|
||||||
|
<n1:Zeitraum>
|
||||||
|
<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum1bis}</n1:Enddatum>
|
||||||
|
<n1:Verbrauchte-Menge>${ausweis.verbrauch_4}</n1:Verbrauchte-Menge>
|
||||||
|
<n1:Energieverbrauch>${result.verbrauch_4_kwh}</n1:Energieverbrauch>
|
||||||
|
<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_2}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
|
||||||
|
<n1:Warmwasserwertermittlung>${warmWasserErmittlung_2}</n1:Warmwasserwertermittlung>
|
||||||
|
<n1:Klimafaktor>${klimafaktoren[0]}</n1:Klimafaktor>
|
||||||
|
</n1:Zeitraum>
|
||||||
|
<n1:Zeitraum>
|
||||||
|
<n1:Startdatum>${Zeitraum2von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum2bis}</n1:Enddatum>
|
||||||
|
<n1:Verbrauchte-Menge>${ausweis.verbrauch_5}</n1:Verbrauchte-Menge>
|
||||||
|
<n1:Energieverbrauch>${result.verbrauch_5_kwh}</n1:Energieverbrauch>
|
||||||
|
<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_2}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
|
||||||
|
<n1:Warmwasserwertermittlung>${warmWasserErmittlung_2}</n1:Warmwasserwertermittlung>
|
||||||
|
<n1:Klimafaktor>${klimafaktoren[1]}</n1:Klimafaktor>
|
||||||
|
</n1:Zeitraum>
|
||||||
|
<n1:Zeitraum>
|
||||||
|
<n1:Startdatum>${Zeitraum3von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
|
||||||
|
<n1:Verbrauchte-Menge>${ausweis.verbrauch_6}</n1:Verbrauchte-Menge>
|
||||||
|
<n1:Energieverbrauch>${result.verbrauch_6_kwh}</n1:Energieverbrauch>
|
||||||
|
<n1:Energieverbrauchsanteil-Warmwasser-zentral>${ausweis.anteil_warmwasser_2}</n1:Energieverbrauchsanteil-Warmwasser-zentral>
|
||||||
|
<n1:Warmwasserwertermittlung>${warmWasserErmittlung_2}</n1:Warmwasserwertermittlung>
|
||||||
|
<n1:Klimafaktor>${klimafaktoren[2]}</n1:Klimafaktor>
|
||||||
|
</n1:Zeitraum>
|
||||||
|
|
||||||
|
</n1:Energietraeger>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
xml += `<n1:Leerstandszuschlag-Heizung>
|
||||||
|
<n1:Leerstandszuschlag-nach-Bekanntmachung>
|
||||||
|
<n1:Leerstandsfaktor>${result.leerstand}</n1:Leerstandsfaktor>
|
||||||
|
<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
|
||||||
|
<n1:Leerstandszuschlag-kWh>${leerstandsZuschlagHeizung}</n1:Leerstandszuschlag-kWh>
|
||||||
|
<n1:Primaerenergiefaktor>${heizwertfaktor_1.primaerenergiefaktor}</n1:Primaerenergiefaktor>
|
||||||
|
</n1:Leerstandszuschlag-nach-Bekanntmachung>
|
||||||
|
</n1:Leerstandszuschlag-Heizung>
|
||||||
|
<n1:Leerstandszuschlag-Warmwasser>`;
|
||||||
|
|
||||||
|
if (
|
||||||
|
ausweis.warmwasser_enthalten &&
|
||||||
|
(gebaeude.leerstand || 0) > 0 &&
|
||||||
|
(ausweis.anteil_warmwasser_1 || 0) > 0
|
||||||
|
) {
|
||||||
|
xml += `<n1:keine-Nutzung-von-WW>${keineNutzungWarmwasser}</n1:keine-Nutzung-von-WW>
|
||||||
|
<n1:kein-Leerstand>Kein längerer Leerstand Warmwasser zu berücksichtigen.</n1:kein-Leerstand>`;
|
||||||
|
} else {
|
||||||
|
xml += `<n1:keine-Nutzung-von-WW>${keineNutzungWarmwasser}</n1:keine-Nutzung-von-WW>
|
||||||
|
<n1:kein-Leerstand>Kein längerer Leerstand Warmwasser zu berücksichtigen.</n1:kein-Leerstand>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
xml += `</n1:Leerstandszuschlag-Warmwasser>
|
||||||
|
<n1:Warmwasserzuschlag>
|
||||||
|
<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
|
||||||
|
<n1:Primaerenergiefaktor>${heizwertfaktor_1.primaerenergiefaktor}</n1:Primaerenergiefaktor>
|
||||||
|
<n1:Warmwasserzuschlag-kWh>${warmwasserZuschlag}</n1:Warmwasserzuschlag-kWh>
|
||||||
|
</n1:Warmwasserzuschlag>
|
||||||
|
<n1:Kuehlzuschlag>
|
||||||
|
<n1:Startdatum>${Zeitraum1von}</n1:Startdatum>
|
||||||
|
<n1:Enddatum>${Zeitraum3bis}</n1:Enddatum>
|
||||||
|
<n1:Gebaeudenutzflaeche-gekuehlt>${flaecheGekuehlt}</n1:Gebaeudenutzflaeche-gekuehlt>
|
||||||
|
<n1:Primaerenergiefaktor>1.8</n1:Primaerenergiefaktor>
|
||||||
|
<n1:Kuehlzuschlag-kWh>${result.kuehlungsZuschlag}</n1:Kuehlzuschlag-kWh>
|
||||||
|
</n1:Kuehlzuschlag>
|
||||||
|
<n1:Mittlerer-Endenergieverbrauch>${endEnergieVerbrauchGesamt}</n1:Mittlerer-Endenergieverbrauch>
|
||||||
|
<n1:Mittlerer-Primaerenergieverbrauch>${primaerEnergieVerbrauchGesamt}</n1:Mittlerer-Primaerenergieverbrauch>
|
||||||
|
<n1:Energieeffizienzklasse>${energieeffizienzKlasse}</n1:Energieeffizienzklasse>
|
||||||
|
</n1:Verbrauchswerte>
|
||||||
|
</n1:Wohngebaeude>
|
||||||
|
<n1:Empfehlungen-moeglich>${empfehlungenMoeglich}</n1:Empfehlungen-moeglich>`;
|
||||||
|
|
||||||
|
let i = 1;
|
||||||
|
for (const empfehlung of empfehlungen) {
|
||||||
|
let description = empfehlung.massnahme.replace(/\n/g, "");
|
||||||
|
xml += `<n1:Modernisierungsempfehlungen>
|
||||||
|
<n1:Nummer>${i}</n1:Nummer>
|
||||||
|
<n1:Bauteil-Anlagenteil>${empfehlung["anlagenteil"]}</n1:Bauteil-Anlagenteil>
|
||||||
|
<n1:Massnahmenbeschreibung>${description}</n1:Massnahmenbeschreibung>
|
||||||
|
<n1:Modernisierungskombination>in Zusammenhang mit größerer Modernisierung</n1:Modernisierungskombination>
|
||||||
|
</n1:Modernisierungsempfehlungen>`;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
xml += `<n1:Extrablatt-Modernisierung>false</n1:Extrablatt-Modernisierung>
|
||||||
|
<n1:Softwarehersteller-Programm-Version>Version 2.0</n1:Softwarehersteller-Programm-Version>
|
||||||
|
</n1:Energieausweis-Daten>
|
||||||
|
</n1:EnEV-Energieausweis>
|
||||||
|
</doc>
|
||||||
|
<ausweisnummer>${ausweis.registriernummer}</ausweisnummer>
|
||||||
|
<username>${Aussteller_ID_DIB}</username>
|
||||||
|
<passwort>${Aussteller_PWD_DIBT}</passwort>
|
||||||
|
</ZusatzdatenErfassung>
|
||||||
|
`;
|
||||||
|
|
||||||
|
return xml;
|
||||||
|
}
|
||||||
125
src/lib/XML/getEmpfehlungen.ts
Normal file
125
src/lib/XML/getEmpfehlungen.ts
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
|
||||||
|
import moment from "moment";
|
||||||
|
|
||||||
|
export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnen, gebaeude: GebaeudeStammdaten): {
|
||||||
|
title: string,
|
||||||
|
description: string,
|
||||||
|
anlagenteil: string
|
||||||
|
}[] {
|
||||||
|
let Warmwasserrohre_gedaemmt = gebaeude.warmwasser_rohre_gedaemmt;
|
||||||
|
let Heizungsrohre_gedaemmt = gebaeude.heizungsrohre_gedaemmt;
|
||||||
|
let Waermepumpe = gebaeude.waermepumpe;
|
||||||
|
let Kellerwand_gedaemmt = gebaeude.keller_wand_gedaemmt;
|
||||||
|
let Keller = ausweis.keller_beheizt;
|
||||||
|
let Kellerdecke_Kalraeume_gedaemmt = gebaeude.keller_decke_gedaemmt;
|
||||||
|
let Brennwertkessel = gebaeude.brennwert_kessel;
|
||||||
|
let baujahr_anlagesanlage = gebaeude.baujahr_heizung[0];
|
||||||
|
let Zentralheizung = gebaeude.zentralheizung;
|
||||||
|
let photovoltaik = gebaeude.photovoltaik;
|
||||||
|
let Brennstoff = ausweis.brennstoff_1;
|
||||||
|
let Aussenwand_gedaemmt = gebaeude.aussenwand_gedaemmt;
|
||||||
|
let Dachgeschoss = gebaeude.dachgeschoss;
|
||||||
|
let Dachgeschoss_gedaemmt = gebaeude.dachgeschoss_gedaemmt;
|
||||||
|
let Oberste_Geschossdecke_gedaemmt = gebaeude.oberste_geschossdecke_gedaemmt;
|
||||||
|
let Einfachglas = gebaeude.einfach_verglasung;
|
||||||
|
let Doppelfenster = gebaeude.doppel_verglasung;
|
||||||
|
let Fenster_teilw_undicht = gebaeude.fenster_teilweise_undicht;
|
||||||
|
|
||||||
|
let empfehlungen = [];
|
||||||
|
|
||||||
|
if (gebaeude.einfach_verglasung || (Doppelfenster && Fenster_teilw_undicht)) {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Erneuerung der Fenster",
|
||||||
|
"description" : "Alte und undichte Fenster mit Wärmeschutzfenstern auswechseln.",
|
||||||
|
"anlagenteil" : "Fenster"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gebaeude.dachgeschoss == "Unbeheizt" && !Oberste_Geschossdecke_gedaemmt) {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Zusätzliche Dämmung des Fußbodens des kalten Dachraumes",
|
||||||
|
"description" : "Beim Einbringen sollten mindestens 16cm Dämmstoff verarbeitet werden. Das Einsparpotenzial ist für jeden zusätzlichen cm Dämmung sehr hoch.",
|
||||||
|
"anlagenteil" : "Dach"
|
||||||
|
});
|
||||||
|
} else if (Dachgeschoss == "Beheizt" && !Dachgeschoss_gedaemmt) {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Zusätzliche Dämmung des Daches bzw. Dachraumes",
|
||||||
|
"description" : "Beim Einbringen sollten mindestens 16cm Dämmstoff, wenn möglich, verarbeitet werden. Das Einsparpotenzial ist für jeden zusätzlichen cm Dämmung sehr hoch.",
|
||||||
|
"anlagenteil" : "Dach"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Aussenwand_gedaemmt) {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Außenwand zusätzl. dämmen (z.B. Wärmedämmverbundsystem, Einblasdämmung, Dämmputz)",
|
||||||
|
"description" : "Beim WDVS sollte man mit Dämmstärken ab 12cm planen. Bei zweischaligem Mauerwerk Luftschicht mit Einblasdämmung füllen. Bei historischen Fassaden kommt u.U. eine Innendämmung in Betracht",
|
||||||
|
"anlagenteil" : "Außenwand gg. Außenluft"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let Relanlagenjahr = moment().year() - 35;
|
||||||
|
|
||||||
|
if ((!Brennwertkessel && !Waermepumpe) && baujahr_anlagesanlage <= Relanlagenjahr && Brennstoff != 'Fernwärme' && Brennstoff != 'Strommix') {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Anlagentechnik",
|
||||||
|
"description" : "Prüfen Sie, ob Sie bei einer Umrüstung auf einen regenerativen Anteil von 65% kommen. Bei energetisch sanierten Gebäuden z.B. Wärmepumpe. Bei unsanieten Gebäuden Fernwärmeanschluss.",
|
||||||
|
"anlagenteil" : "Wärmeerzeuger"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Kellerdecke_Kalraeume_gedaemmt && Keller == "Unbeheizt") {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Nachträgliche Dämmung der Kellerdecke",
|
||||||
|
"description" : "Je nach Deckenhöhe, den vorhandenen Raum voll ausnutzen. Das Einsparpotenzial für jeden zusätzlichen cm Dämmung sehr hoch.",
|
||||||
|
"anlagenteil" : "Kellerdecke"
|
||||||
|
});
|
||||||
|
} else if (!Kellerwand_gedaemmt && Keller == "Beheizt") {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Nachträgliche Dämmung der Kellerwände",
|
||||||
|
"description" : "Man sollte mit Dämmstärken ab 12cm planen. Das Einsparpotenzial für jeden zusätzlichen cm Dämmung sehr hoch.",
|
||||||
|
"anlagenteil" : "Außenwand gg. Erdreich"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Zentralheizung) {
|
||||||
|
if (!Warmwasserrohre_gedaemmt && !Heizungsrohre_gedaemmt) {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Anlagentechnik",
|
||||||
|
"description" : "Heizungsrohre und Warmwasserrohre dämmen",
|
||||||
|
"anlagenteil" : "Wärmeverteilung / -abgabe"
|
||||||
|
});
|
||||||
|
} else if (Warmwasserrohre_gedaemmt && !Heizungsrohre_gedaemmt) {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Anlagentechnik",
|
||||||
|
"description" : "Heizungsrohre dämmen",
|
||||||
|
"anlagenteil" : "Wärmeverteilung / -abgabe"
|
||||||
|
});
|
||||||
|
} else if (!Warmwasserrohre_gedaemmt && Heizungsrohre_gedaemmt) {
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Anlagentechnik",
|
||||||
|
"description" : "Warmwasserrohre dämmen",
|
||||||
|
"anlagenteil" : "Wärmeverteilung / -abgabe"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((baujahr_anlagesanlage <= (moment().year() - 30)) && (Brennstoff == "Heizöl" || Brennstoff == "Erdgas") && !Waermepumpe) {
|
||||||
|
// Wärmepumpe
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Wärmeerzeuger",
|
||||||
|
"description" : "Prüfen Sie den zusätzlichen Einbau einer Luft-Wasser-Wärmepumpe. Mit einem Pufferspeicher und einer 75°C-Vorlauftemperatur-Wärmepumpe kann ein relevanter Anteil der Wärmeerzeugung abgedeckt werden.",
|
||||||
|
"anlagenteil" : "Wärmeerzeuger"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!photovoltaik && Brennstoff == "Strommix") {
|
||||||
|
// Wärmepumpe
|
||||||
|
empfehlungen.push({
|
||||||
|
"title" : "Wärmeerzeuger",
|
||||||
|
"description" : "PV-Anlage auf das Dach (für Energieunterstützung)",
|
||||||
|
"anlagenteil" : "Wärmeerzeuger"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return empfehlungen;
|
||||||
|
}
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
import { db } from "../shared";
|
|
||||||
|
|
||||||
type DatabaseZIPInformation = {
|
|
||||||
zip: string,
|
|
||||||
city: string,
|
|
||||||
state: string
|
|
||||||
};
|
|
||||||
|
|
||||||
export class ZIPInformation {
|
|
||||||
public constructor(public zip: string, public city: string, public state: string) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async fromZipCode(zip: string): Promise<null | ZIPInformation[]> {
|
|
||||||
if (zip.length > 5) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
let results = await db<DatabaseZIPInformation>("zip_codes").select("*").whereLike("zip", `${zip}%`).limit(10);
|
|
||||||
|
|
||||||
if (!results) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return results.map(result => new ZIPInformation(result.zip, result.city, result.state))
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async fromCity(city: string): Promise<null | ZIPInformation[]> {
|
|
||||||
let results = await db<DatabaseZIPInformation>("zip_codes").select("*").where("city", city);
|
|
||||||
|
|
||||||
if (!results) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return results.map(result => new ZIPInformation(result.zip, result.city, result.state))
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async fromState(state: string): Promise<null | ZIPInformation[]> {
|
|
||||||
let results = await db<DatabaseZIPInformation>("zip_codes").select("*").where("state", state);
|
|
||||||
|
|
||||||
if (!results) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return results.map(result => new ZIPInformation(result.zip, result.city, result.state))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
import { Benutzer, Rechnungen, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
|
|
||||||
import { Gebaeude } from "src/lib/Gebaeude";
|
|
||||||
import { getKlimafaktorenClient } from "src/lib/Klimafaktoren";
|
|
||||||
import { getHeizwertfaktor } from "src/lib/server/Heizwertfaktor";
|
|
||||||
|
|
||||||
|
|
||||||
export class Verbrauchsausweis implements Partial<VerbrauchsausweisWohnen & { benutzer: Benutzer, rechnung: Rechnungen }> {
|
|
||||||
rechnungen_id: number | null = null;
|
|
||||||
erstellungsdatum: Date | null = null;
|
|
||||||
ausstellgrund: string | null = null;
|
|
||||||
registriernummer: string | null = null;
|
|
||||||
erledigt: boolean | null = null;
|
|
||||||
baujahr_heizung: number[] = [];
|
|
||||||
zusaetzliche_heizquelle: boolean | null = null;
|
|
||||||
brennstoff_1: string | null = null;
|
|
||||||
einheit_1: string | null = null;
|
|
||||||
brennstoff_2: string | null = null;
|
|
||||||
einheit_2: string | null = null;
|
|
||||||
startdatum: Date | null = null;
|
|
||||||
enddatum: Date | null = null;
|
|
||||||
verbrauch_1: number | null = null;
|
|
||||||
verbrauch_2: number | null = null;
|
|
||||||
verbrauch_3: number | null = null;
|
|
||||||
verbrauch_4: number | null = null;
|
|
||||||
verbrauch_5: number | null = null;
|
|
||||||
verbrauch_6: number | null = null;
|
|
||||||
warmwasser_enthalten: boolean | null = null;
|
|
||||||
anteil_warmwasser_1: number | null = null;
|
|
||||||
anteil_warmwasser_2: number | null = null;
|
|
||||||
|
|
||||||
public get energetischeNutzflaeche(): number {
|
|
||||||
return (
|
|
||||||
this.gebaeude.wohnflaeche *
|
|
||||||
(this.gebaeude.keller_beheizt ? 1.35 : 1.2)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public regnummer?: string;
|
|
||||||
|
|
||||||
public gebaeude: Gebaeude = new Gebaeude();
|
|
||||||
|
|
||||||
public constructor(initializer?: VerbrauchsausweisWohnen) {
|
|
||||||
if (initializer) {
|
|
||||||
Object.assign(this, initializer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public get primaerEnergieVerbrauch(): Promise<number> {
|
|
||||||
return (async () => {
|
|
||||||
const Endenergieverbrauch = await this.endEnergieVerbrauch;
|
|
||||||
|
|
||||||
const brennstoff_1 = getHeizwertfaktor(
|
|
||||||
this.brennstoff_1,
|
|
||||||
this.einheit_1
|
|
||||||
);
|
|
||||||
|
|
||||||
return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
public get endEnergieVerbrauch(): Promise<number> {
|
|
||||||
return (async () => {
|
|
||||||
const date = this.startdatum;
|
|
||||||
const klimafaktoren = await getKlimafaktorenClient(
|
|
||||||
date,
|
|
||||||
this.gebaeude.plz
|
|
||||||
);
|
|
||||||
|
|
||||||
// Endenergieverbrauch
|
|
||||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
|
||||||
let brennstoff_1 = getHeizwertfaktor(
|
|
||||||
this.brennstoff_1,
|
|
||||||
this.einheit_1
|
|
||||||
);
|
|
||||||
let brennstoff_2 = getHeizwertfaktor(
|
|
||||||
this.brennstoff_2,
|
|
||||||
this.einheit_2
|
|
||||||
);
|
|
||||||
|
|
||||||
let verbrauch_1_kwh =
|
|
||||||
this.verbrauch_1 * brennstoff_1.umrechnungsfaktor;
|
|
||||||
let verbrauch_2_kwh =
|
|
||||||
this.verbrauch_2 * brennstoff_1.umrechnungsfaktor;
|
|
||||||
let verbrauch_3_kwh =
|
|
||||||
this.verbrauch_3 * brennstoff_1.umrechnungsfaktor;
|
|
||||||
let verbrauch_4_kwh =
|
|
||||||
this.verbrauch_4 * brennstoff_2.umrechnungsfaktor;
|
|
||||||
let verbrauch_5_kwh =
|
|
||||||
this.verbrauch_5 * brennstoff_2.umrechnungsfaktor;
|
|
||||||
let verbrauch_6_kwh =
|
|
||||||
this.verbrauch_6 * brennstoff_2.umrechnungsfaktor;
|
|
||||||
|
|
||||||
let warmwasserZuschlag = 0;
|
|
||||||
let leerstandsZuschlag = 0;
|
|
||||||
let kuehlungsZuschlag = 0;
|
|
||||||
if (this.anteil_warmwasser_1 == 0) {
|
|
||||||
warmwasserZuschlag = 20 * this.energetischeNutzflaeche * 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.gebaeude.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.gebaeude.leerstand / 100)) /
|
|
||||||
durchschnittsKlimafaktor;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.gebaeude.energiequelle_2_nutzung[3]) {
|
|
||||||
kuehlungsZuschlag = 6 * this.energetischeNutzflaeche * 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.energetischeNutzflaeche;
|
|
||||||
|
|
||||||
return Energieverbrauchskennwert;
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export { default as Verbrauchsausweis } from "./Verbrauchsausweis";
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import { Ausweis } from "src/lib/Ausweis/Ausweis";
|
|
||||||
import { Dachgeschoss, Lueftungskonzept } from "src/lib/Ausweis/types";
|
|
||||||
import { BitChecker } from "src/lib/BitChecker";
|
|
||||||
|
|
||||||
export class Gebaeude {
|
|
||||||
public typ: string = "";
|
|
||||||
public plz: string = "";
|
|
||||||
public ort: string = "";
|
|
||||||
public strasse: string = "";
|
|
||||||
public gebaeudeteil: string = "";
|
|
||||||
public saniert: boolean = false;
|
|
||||||
public baujahr: number = 0;
|
|
||||||
public einheiten: number = 0;
|
|
||||||
public wohnflaeche: number = 0;
|
|
||||||
public keller_beheizt: boolean = false;
|
|
||||||
public dachgeschoss_beheizt: Dachgeschoss = Dachgeschoss.UNBEHEIZT;
|
|
||||||
public lueftungskonzept: Lueftungskonzept = "Fensterlüftung";
|
|
||||||
public wird_gekuehlt: boolean = false;
|
|
||||||
public leerstand: number = 0;
|
|
||||||
public versorgungssysteme: boolean[] = BitChecker(0);
|
|
||||||
public fenster_dach: boolean[] = BitChecker(0);
|
|
||||||
public energiequelle_2_nutzung: boolean[] = BitChecker(0);
|
|
||||||
public daemmung: boolean[] = BitChecker(0);
|
|
||||||
|
|
||||||
public ausweis?: Ausweis;
|
|
||||||
|
|
||||||
public uid?: string;
|
|
||||||
|
|
||||||
public constructor(initializer?: Gebaeude) {
|
|
||||||
if (initializer) {
|
|
||||||
this.typ = initializer.typ;
|
|
||||||
this.plz = initializer.plz;
|
|
||||||
this.ort = initializer.ort;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
export async function fetch(resourceUri: string, options?: RequestInit): Promise<any> {
|
|
||||||
const response = await fetch(`/api/${resourceUri}`, options);
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error("Fehler beim Abrufen der Daten.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return response.json();
|
|
||||||
}
|
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
import { auditBedarfsausweisBenoetigt } from "#components/Verbrauchsausweis/audits/BedarfsausweisBenoetigt";
|
import { auditBedarfsausweisBenoetigt } from "#components/Verbrauchsausweis/audits/BedarfsausweisBenoetigt";
|
||||||
import { auditVerbrauchAbweichung } from "#components/Verbrauchsausweis/audits/VerbrauchAbweichung";
|
import { auditVerbrauchAbweichung } from "#components/Verbrauchsausweis/audits/VerbrauchAbweichung";
|
||||||
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
|
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
|
||||||
|
import trpc from "src/trpc";
|
||||||
|
|
||||||
export let uid: string = "";
|
export let uid: string = "";
|
||||||
|
|
||||||
@@ -58,8 +59,24 @@
|
|||||||
gebaeude = gebaeude;
|
gebaeude = gebaeude;
|
||||||
ausweis = ausweis;
|
ausweis = ausweis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function ausweisAbschicken() {
|
||||||
|
overlay.ariaHidden = "false";
|
||||||
|
const response = await trpc.v1.verbrauchsausweisWohnen[2016].erstellen.mutate({
|
||||||
|
...ausweis,
|
||||||
|
gebaeude_stammdaten: gebaeude
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let overlay: HTMLDivElement;
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={overlay} aria-hidden="true" class="aria-hidden:hidden fixed top-0 left-0 w-[100vw] h-[100vh] flex items-center justify-center bg-[rgba(0,0,0,0.8)] z-50">
|
||||||
|
<p class="text-white font-semibold text-4xl">Bitte warten sie, ihr Ausweis wird nun erstellt.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-row gap-8 items-center mb-8">
|
<div class="flex flex-row gap-8 items-center mb-8">
|
||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<h1>Verbrauchsausweis erstellen - 45€</h1>
|
<h1>Verbrauchsausweis erstellen - 45€</h1>
|
||||||
@@ -69,8 +86,8 @@
|
|||||||
<PerformanceScore bind:ausweis bind:gebaeude />
|
<PerformanceScore bind:ausweis bind:gebaeude />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form method="post" action="/verbrauchsausweis/erstellen">
|
<div>
|
||||||
<fieldset
|
<div
|
||||||
class="bg-[rgba(252,234,187,0.2)] border-2 p-4 rounded-lg border-[#ffcc03]"
|
class="bg-[rgba(252,234,187,0.2)] border-2 p-4 rounded-lg border-[#ffcc03]"
|
||||||
>
|
>
|
||||||
<div class="flex flex-row justify-between">
|
<div class="flex flex-row justify-between">
|
||||||
@@ -107,8 +124,7 @@
|
|||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<input
|
<input
|
||||||
name="IGstrasse"
|
name="adresse"
|
||||||
class=" strasse"
|
|
||||||
type="text"
|
type="text"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
required
|
required
|
||||||
@@ -128,14 +144,13 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- IGort: readonly entfernt - Nelson -->
|
|
||||||
<div class="form-group col-md-4">
|
<div class="form-group col-md-4">
|
||||||
<HelpLabel title="Ort *">
|
<HelpLabel title="Ort *">
|
||||||
Ort des Gebäudes wird automatisch ermittelt.
|
Ort des Gebäudes wird automatisch ermittelt.
|
||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<input
|
<input
|
||||||
name="IGort"
|
name="ort"
|
||||||
readonly={true}
|
readonly={true}
|
||||||
bind:value={gebaeude.ort}
|
bind:value={gebaeude.ort}
|
||||||
type="text"
|
type="text"
|
||||||
@@ -152,7 +167,7 @@
|
|||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<input
|
<input
|
||||||
name="IGflaeche"
|
name="flaeche"
|
||||||
maxlength="4"
|
maxlength="4"
|
||||||
type="number"
|
type="number"
|
||||||
required
|
required
|
||||||
@@ -169,7 +184,7 @@
|
|||||||
<Label>Keller *</Label>
|
<Label>Keller *</Label>
|
||||||
<div>
|
<div>
|
||||||
<select
|
<select
|
||||||
name="IGkeller"
|
name="keller_beheizt"
|
||||||
required
|
required
|
||||||
bind:value={ausweis.keller_beheizt}
|
bind:value={ausweis.keller_beheizt}
|
||||||
>
|
>
|
||||||
@@ -185,7 +200,7 @@
|
|||||||
<div class="form-group col-md-4">
|
<div class="form-group col-md-4">
|
||||||
<Label>Dachgeschoss *</Label>
|
<Label>Dachgeschoss *</Label>
|
||||||
<div>
|
<div>
|
||||||
<select name="IGdach" class="" required>
|
<select name="dachgeschoss" required>
|
||||||
<option>Bitte auswählen</option>
|
<option>Bitte auswählen</option>
|
||||||
<option value="dnein">nicht vorhanden</option>
|
<option value="dnein">nicht vorhanden</option>
|
||||||
<option value="dub">unbeheizt</option>
|
<option value="dub">unbeheizt</option>
|
||||||
@@ -217,8 +232,7 @@
|
|||||||
<label class="radio-inline"
|
<label class="radio-inline"
|
||||||
><input
|
><input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="IGwwbool"
|
name="warmwasser_enthalten"
|
||||||
name="IGwwbool"
|
|
||||||
bind:checked={ausweis
|
bind:checked={ausweis
|
||||||
.warmwasser_enthalten}
|
.warmwasser_enthalten}
|
||||||
/>Warmwasser im Verbrauch enthalten</label
|
/>Warmwasser im Verbrauch enthalten</label
|
||||||
@@ -234,7 +248,7 @@
|
|||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
|
|
||||||
<input
|
<input
|
||||||
name="IGwarmwasser"
|
name="anteil_warmwasser_1"
|
||||||
maxlength="2"
|
maxlength="2"
|
||||||
type="number"
|
type="number"
|
||||||
bind:value={ausweis.anteil_warmwasser_1}
|
bind:value={ausweis.anteil_warmwasser_1}
|
||||||
@@ -250,7 +264,7 @@
|
|||||||
ein Anteil von 18% angenommen.
|
ein Anteil von 18% angenommen.
|
||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<input
|
<input
|
||||||
name="IGwarmwasser2"
|
name="anteil_warmwasser_2"
|
||||||
maxlength="3"
|
maxlength="3"
|
||||||
type="number"
|
type="number"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
@@ -273,7 +287,7 @@
|
|||||||
<label class="checkbox-inline"
|
<label class="checkbox-inline"
|
||||||
><input
|
><input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="IGversorgungssysteme1"
|
name="alternative_heizung"
|
||||||
bind:checked={ausweis.alternative_heizung}
|
bind:checked={ausweis.alternative_heizung}
|
||||||
value="Heizung"
|
value="Heizung"
|
||||||
/>Heizung</label
|
/>Heizung</label
|
||||||
@@ -281,7 +295,7 @@
|
|||||||
<label class="checkbox-inline"
|
<label class="checkbox-inline"
|
||||||
><input
|
><input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="IGversorgungssysteme2"
|
name="alternative_warmwasser"
|
||||||
bind:checked={ausweis.alternative_warmwasser}
|
bind:checked={ausweis.alternative_warmwasser}
|
||||||
value="Warmwasser"
|
value="Warmwasser"
|
||||||
/>Warmwasser</label
|
/>Warmwasser</label
|
||||||
@@ -289,7 +303,7 @@
|
|||||||
<label class="checkbox-inline"
|
<label class="checkbox-inline"
|
||||||
><input
|
><input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="IGversorgungssysteme3"
|
name="alternative_lueftung"
|
||||||
bind:checked={ausweis.alternative_lueftung}
|
bind:checked={ausweis.alternative_lueftung}
|
||||||
value="Lüftung"
|
value="Lüftung"
|
||||||
/>Lüftung</label
|
/>Lüftung</label
|
||||||
@@ -297,7 +311,7 @@
|
|||||||
<label class="checkbox-inline"
|
<label class="checkbox-inline"
|
||||||
><input
|
><input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="IGversorgungssysteme4"
|
name="alternative_kuehlung "
|
||||||
bind:checked={ausweis.alternative_kuehlung}
|
bind:checked={ausweis.alternative_kuehlung}
|
||||||
value="Kühlung"
|
value="Kühlung"
|
||||||
/>Kühlung</label
|
/>Kühlung</label
|
||||||
@@ -320,7 +334,7 @@
|
|||||||
Bitte wählen Sie hier den Gebäudetyp aus.
|
Bitte wählen Sie hier den Gebäudetyp aus.
|
||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<select name="IGtyp" class="" required autocomplete="off">
|
<select name="gebaeudetyp" required autocomplete="off">
|
||||||
<option>Bitte auswählen</option>
|
<option>Bitte auswählen</option>
|
||||||
<option value="Einfamilienhaus">Einfamilienhaus</option>
|
<option value="Einfamilienhaus">Einfamilienhaus</option>
|
||||||
<option value="Freistehendes Einfamilienhaus"
|
<option value="Freistehendes Einfamilienhaus"
|
||||||
@@ -359,7 +373,7 @@
|
|||||||
'Gewerbe'.
|
'Gewerbe'.
|
||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<select name="IGteil" class="" required autocomplete="off">
|
<select name="gebaeudeteil" class="" required autocomplete="off">
|
||||||
<option>Bitte auswählen</option>
|
<option>Bitte auswählen</option>
|
||||||
<option value="Gesamtgebäude">Gesamtgebäude</option>
|
<option value="Gesamtgebäude">Gesamtgebäude</option>
|
||||||
<option value="Wohnen">Wohnen</option>
|
<option value="Wohnen">Wohnen</option>
|
||||||
@@ -375,10 +389,10 @@
|
|||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<select
|
<select
|
||||||
name="IGlueftung"
|
name="lueftung"
|
||||||
class=""
|
|
||||||
required
|
required
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
|
bind:value={gebaeude.lueftung}
|
||||||
>
|
>
|
||||||
<option>Bitte auswählen</option>
|
<option>Bitte auswählen</option>
|
||||||
<option value="Fensterlüftung">Fensterlüftung</option>
|
<option value="Fensterlüftung">Fensterlüftung</option>
|
||||||
@@ -401,10 +415,11 @@
|
|||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<select
|
<select
|
||||||
name="IGkuehlung"
|
name="kuehlung"
|
||||||
class=""
|
class=""
|
||||||
required
|
required
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
|
bind:value={gebaeude.kuehlung}
|
||||||
>
|
>
|
||||||
<option>Bitte auswählen</option>
|
<option>Bitte auswählen</option>
|
||||||
<option value="1">vorhanden</option>
|
<option value="1">vorhanden</option>
|
||||||
@@ -422,10 +437,11 @@
|
|||||||
</HelpLabel>
|
</HelpLabel>
|
||||||
<div>
|
<div>
|
||||||
<input
|
<input
|
||||||
name="IGleer"
|
name="leerstand"
|
||||||
maxlength="2"
|
maxlength="2"
|
||||||
type="text"
|
type="text"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
|
bind:value={gebaeude.leerstand}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -441,10 +457,10 @@
|
|||||||
<hr />
|
<hr />
|
||||||
<div class="flex flex-row justify-between">
|
<div class="flex flex-row justify-between">
|
||||||
<Hilfe />
|
<Hilfe />
|
||||||
<button class="button">Weiter</button>
|
<button class="button" on:click={ausweisAbschicken}>Weiter</button>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<RawNotificationWrapper>
|
<RawNotificationWrapper>
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
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({});
|
|
||||||
};
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
import { prisma } from "@ibcornelsen/database";
|
|
||||||
import type { APIRoute } from "astro";
|
|
||||||
import { ActionFailedError, MissingEntityError, error, success } from "src/lib/APIResponse";
|
|
||||||
import { Ausweis } from "src/lib/Ausweis/Ausweis";
|
|
||||||
import { Gebaeude } from "src/lib/Gebaeude";
|
|
||||||
import { z } from "zod";
|
|
||||||
|
|
||||||
const AusweisUploadChecker = z.object({
|
|
||||||
ausweis: z.object({
|
|
||||||
ausweisart: z.enum(["VA", "BA", "VANW"]),
|
|
||||||
ausstellgrund: z.enum([
|
|
||||||
"Vermietung",
|
|
||||||
"Neubau",
|
|
||||||
"Verkauf",
|
|
||||||
"Modernisierung",
|
|
||||||
"Sonstiges",
|
|
||||||
]),
|
|
||||||
}),
|
|
||||||
|
|
||||||
gebaeude: z.object({
|
|
||||||
typ: z.string(),
|
|
||||||
plz: z.string(),
|
|
||||||
ort: z.string(),
|
|
||||||
strasse: z.string(),
|
|
||||||
gebaeudeteil: z.string(),
|
|
||||||
saniert: z.boolean(),
|
|
||||||
baujahr: z.number(),
|
|
||||||
einheiten: z.number(),
|
|
||||||
wohnflaeche: z.number(),
|
|
||||||
keller_beheizt: z.boolean(),
|
|
||||||
dachgeschoss_beheizt: z.number(),
|
|
||||||
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(),
|
|
||||||
versorgungssysteme: z.number(),
|
|
||||||
fenster_dach: z.number(),
|
|
||||||
energiequelle_2_nutzung: z.number(),
|
|
||||||
daemmung: z.number(),
|
|
||||||
}),
|
|
||||||
|
|
||||||
kennwerte: z.object({
|
|
||||||
zeitraum: z.string(),
|
|
||||||
verbrauch_1: z.number(),
|
|
||||||
verbrauch_2: z.number(),
|
|
||||||
verbrauch_3: z.number(),
|
|
||||||
verbrauch_4: z.number(),
|
|
||||||
verbrauch_5: z.number(),
|
|
||||||
verbrauch_6: z.number(),
|
|
||||||
einheit_1: z.string(),
|
|
||||||
einheit_2: z.string(),
|
|
||||||
energietraeger_1: z.string(),
|
|
||||||
energietraeger_2: z.string(),
|
|
||||||
anteil_warmwasser_1: z.number(),
|
|
||||||
anteil_warmwasser_2: z.number(),
|
|
||||||
}),
|
|
||||||
|
|
||||||
gebaeude_uid: z.string().optional(),
|
|
||||||
kennwerte_uid: z.string().optional(),
|
|
||||||
ausweis_uid: z.string().optional(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const AusweisDownloadChecker = z.object({
|
|
||||||
uid: 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: z.infer<typeof AusweisUploadChecker> = await request.json();
|
|
||||||
|
|
||||||
const validation = AusweisUploadChecker.safeParse(body);
|
|
||||||
|
|
||||||
if (!validation.success) {
|
|
||||||
return error(validation.error.issues);
|
|
||||||
}
|
|
||||||
|
|
||||||
let gebaeude, ausweis;
|
|
||||||
if (body.gebaeude_uid) {
|
|
||||||
gebaeude = await prisma.gebaeudeStammdaten.update({
|
|
||||||
where: {
|
|
||||||
uid: body.gebaeude_uid,
|
|
||||||
},
|
|
||||||
data: body.gebaeude,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
gebaeude = await prisma.gebaeudeStammdaten.create({
|
|
||||||
data: body.gebaeude,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gebaeude) {
|
|
||||||
return ActionFailedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (body.ausweis_uid) {
|
|
||||||
ausweis = await prisma.verbrauchsausweisWohnen.update({
|
|
||||||
where: {
|
|
||||||
uid: body.ausweis_uid,
|
|
||||||
},
|
|
||||||
data: body.ausweis,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
ausweis = await prisma.verbrauchsausweisWohnen.create({
|
|
||||||
data: body.ausweis,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ausweis) {
|
|
||||||
return ActionFailedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
return success({
|
|
||||||
ausweis: ausweis,
|
|
||||||
gebaeude: gebaeude,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const get: APIRoute = async ({ request }) => {
|
|
||||||
const body: z.infer<typeof AusweisDownloadChecker> = await request.json();
|
|
||||||
|
|
||||||
const validation = AusweisDownloadChecker.safeParse(body);
|
|
||||||
|
|
||||||
if (!validation.success) {
|
|
||||||
return error(validation.error.issues);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
|
||||||
where: {
|
|
||||||
uid: body.uid,
|
|
||||||
},
|
|
||||||
include: {
|
|
||||||
gebaeude_stammdaten: true,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!ausweis) {
|
|
||||||
return MissingEntityError("gebäude");
|
|
||||||
}
|
|
||||||
|
|
||||||
return success(ausweis);
|
|
||||||
};
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import type { APIRoute } from "astro";
|
|
||||||
import {
|
|
||||||
MissingEntityError,
|
|
||||||
error,
|
|
||||||
success,
|
|
||||||
} from "src/lib/APIResponse";
|
|
||||||
import { prisma } from "@ibcornelsen/database";
|
|
||||||
|
|
||||||
export const get: APIRoute = async ({ url }) => {
|
|
||||||
const body = url.searchParams
|
|
||||||
const uid = body.get("uid")
|
|
||||||
|
|
||||||
if (!body.has("uid") || !uid) {
|
|
||||||
return error(["Missing 'uid' in request body."])
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const gebaeude = await prisma.gebaeudeStammdaten.findUnique({
|
|
||||||
where: {
|
|
||||||
uid: uid
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!gebaeude) {
|
|
||||||
return MissingEntityError("gebaeude")
|
|
||||||
}
|
|
||||||
|
|
||||||
const images = await prisma.gebaeudeBilder.findMany({
|
|
||||||
where: {
|
|
||||||
gebaeude_stammdaten_id: gebaeude.id
|
|
||||||
},
|
|
||||||
select: {
|
|
||||||
uid: true,
|
|
||||||
kategorie: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return success(images);
|
|
||||||
};
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
import type { APIRoute } from "astro";
|
|
||||||
import moment from "moment";
|
|
||||||
import { ActionFailedError, MissingPropertyError, error, success } from "src/lib/APIResponse";
|
|
||||||
import { getClimateFactor } from "src/lib/Klimafaktoren/getClimateFactor";
|
|
||||||
|
|
||||||
export const get: APIRoute = async function({ url }) {
|
|
||||||
const body = url.searchParams;
|
|
||||||
let zip = body.get("zip");
|
|
||||||
|
|
||||||
if (!body.get("date")) {
|
|
||||||
return MissingPropertyError(["date"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
let accuracy = body.get("accuracy") || "months";
|
|
||||||
|
|
||||||
if (accuracy !== "months" && accuracy !== "years") {
|
|
||||||
return error(["Accuracy must be either 'months' or 'years'."])
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!zip) {
|
|
||||||
return error(["Invalid ZIP Code, must be 4 or 5 characters long."])
|
|
||||||
}
|
|
||||||
|
|
||||||
let start = moment(body.get("date"));
|
|
||||||
let end = moment(body.get("date")).add("2", "years");
|
|
||||||
|
|
||||||
if (!start.isValid()) {
|
|
||||||
return error(["Invalid start date given."]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!end.isValid()) {
|
|
||||||
return error(["Invalid end date given."]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start.isSameOrAfter(end)) {
|
|
||||||
return error(["Start date not before end date."])
|
|
||||||
}
|
|
||||||
|
|
||||||
const intervals = [];
|
|
||||||
|
|
||||||
let currentDate = start.clone();
|
|
||||||
while (currentDate.isSameOrBefore(end)) {
|
|
||||||
let copy = currentDate.clone();
|
|
||||||
intervals.push(copy);
|
|
||||||
currentDate.add(1, accuracy);
|
|
||||||
}
|
|
||||||
|
|
||||||
const klimafaktoren = await getClimateFactor(intervals, zip);
|
|
||||||
|
|
||||||
if (!klimafaktoren) {
|
|
||||||
return ActionFailedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (klimafaktoren.length !== intervals.length) {
|
|
||||||
return error(["Not all dates could be found."]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return success(klimafaktoren.map(klimafaktor => ({
|
|
||||||
month: klimafaktor.month,
|
|
||||||
year: klimafaktor.year,
|
|
||||||
klimafaktor: klimafaktor.klimafaktor,
|
|
||||||
})));
|
|
||||||
}
|
|
||||||
31
src/pages/api/trpc/[trpc].ts
Normal file
31
src/pages/api/trpc/[trpc].ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
// NOTE: Öffentliche API benötigt OpenApiMeta. Das Package bräuchte momentan noch einen extra Server, deshalb nehmen wir es momentan noch nicht mit rein.
|
||||||
|
//import { OpenApiMeta } from "trpc-openapi";
|
||||||
|
import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
|
||||||
|
import { APIRoute } from "astro";
|
||||||
|
import { t } from "./context";
|
||||||
|
import { v1Router } from "./procedures/v1";
|
||||||
|
|
||||||
|
export const AppRouter = t.router({
|
||||||
|
v1: v1Router,
|
||||||
|
})
|
||||||
|
|
||||||
|
export const all: APIRoute = ({ request }) => {
|
||||||
|
console.log(request);
|
||||||
|
|
||||||
|
return fetchRequestHandler({
|
||||||
|
req: request,
|
||||||
|
endpoint: "/api/trpc",
|
||||||
|
router: AppRouter,
|
||||||
|
createContext: async ({ req }) => {
|
||||||
|
return { uid: req.headers.get("X-Session") ?? undefined };
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export function tRPCCaller(request: Request) {
|
||||||
|
const { uid } = { uid: request.headers.get("Authorization") || "" };
|
||||||
|
const createCaller = t.createCallerFactory(AppRouter);
|
||||||
|
return createCaller({ uid });
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AppRouter = typeof AppRouter;
|
||||||
34
src/pages/api/trpc/context.ts
Normal file
34
src/pages/api/trpc/context.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import { TRPCError, initTRPC } from "@trpc/server";
|
||||||
|
import { ZodError } from "zod";
|
||||||
|
import { OpenApiMeta } from "trpc-openapi";
|
||||||
|
|
||||||
|
type Context = { uid?: string };
|
||||||
|
|
||||||
|
export const t = initTRPC.context<Context>().meta<OpenApiMeta>().create({
|
||||||
|
errorFormatter(opts) {
|
||||||
|
const { shape, error } = opts;
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
...shape,
|
||||||
|
data: {
|
||||||
|
zodError:
|
||||||
|
error.code === 'BAD_REQUEST' && error.cause instanceof ZodError
|
||||||
|
? error.cause.flatten()
|
||||||
|
: null,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export const publicProcedure = t.procedure
|
||||||
|
|
||||||
|
export const privateProcedure = t.procedure.use((opts) => {
|
||||||
|
if (!opts.ctx.uid) {
|
||||||
|
throw new TRPCError({
|
||||||
|
code: 'FORBIDDEN',
|
||||||
|
message: "Diese Ressource benötigt eine UID, welche im 'Authorization' Header gegeben sein muss.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return opts.next();
|
||||||
|
});
|
||||||
42
src/pages/api/trpc/procedures/v1/index.ts
Normal file
42
src/pages/api/trpc/procedures/v1/index.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
import { t } from "../../context";
|
||||||
|
import { tRPCKlimafaktorenProcedure } from "./klimafaktoren";
|
||||||
|
import { VerbrauchsausweisWohnen2016Erstellen } from "./verbrauchsausweis-wohnen/2016/erstellen";
|
||||||
|
|
||||||
|
const router = t.router;
|
||||||
|
|
||||||
|
export const v1Router = router({
|
||||||
|
verbrauchsausweisWohnen: router({
|
||||||
|
2016: router({
|
||||||
|
erstellen: VerbrauchsausweisWohnen2016Erstellen
|
||||||
|
}),
|
||||||
|
2023: router({
|
||||||
|
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
verbrauchsausweisGewerbe: router({
|
||||||
|
2016: router({
|
||||||
|
|
||||||
|
}),
|
||||||
|
2023: router({
|
||||||
|
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
bedarfsausweisWohen: router({
|
||||||
|
2016: router({
|
||||||
|
|
||||||
|
}),
|
||||||
|
2023: router({
|
||||||
|
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
klimafaktoren: tRPCKlimafaktorenProcedure,
|
||||||
|
test: t.procedure.meta({
|
||||||
|
openapi: {
|
||||||
|
method: "GET",
|
||||||
|
path: "/v1/test",
|
||||||
|
}
|
||||||
|
}).input(z.void({})).output(z.string()).query(async (opts) => {
|
||||||
|
return "Hello World!";
|
||||||
|
})
|
||||||
|
})
|
||||||
78
src/pages/api/trpc/procedures/v1/klimafaktoren.ts
Normal file
78
src/pages/api/trpc/procedures/v1/klimafaktoren.ts
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
import { t } from "../../context";
|
||||||
|
import moment from "moment";
|
||||||
|
import { TRPCError } from "@trpc/server";
|
||||||
|
import { prisma } from "@ibcornelsen/database";
|
||||||
|
|
||||||
|
export const tRPCKlimafaktorenProcedure = t.procedure
|
||||||
|
.input(
|
||||||
|
z.object({
|
||||||
|
plz: z.string().min(4).max(5),
|
||||||
|
startdatum: z.coerce.date(),
|
||||||
|
enddatum: z.coerce.date(),
|
||||||
|
genauigkeit: z.enum(["months", "years"]),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.output(
|
||||||
|
z.array(
|
||||||
|
z.object({
|
||||||
|
month: z.number(),
|
||||||
|
year: z.number(),
|
||||||
|
klimafaktor: z.number(),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.query(async (opts) => {
|
||||||
|
const start = moment(opts.input.startdatum);
|
||||||
|
const end = moment(opts.input.enddatum);
|
||||||
|
|
||||||
|
if (start.isSameOrAfter(end)) {
|
||||||
|
throw new TRPCError({
|
||||||
|
code: "PRECONDITION_FAILED",
|
||||||
|
message: "Das Startdatum kann nicht vor dem Enddatum liegen.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const intervals = [];
|
||||||
|
|
||||||
|
let currentDate = start.clone();
|
||||||
|
while (currentDate.isSameOrBefore(end)) {
|
||||||
|
let copy = currentDate.clone();
|
||||||
|
intervals.push(copy);
|
||||||
|
currentDate.add(1, opts.input.genauigkeit);
|
||||||
|
}
|
||||||
|
|
||||||
|
let klimafaktoren = await prisma.klimafaktoren.findMany({
|
||||||
|
where: {
|
||||||
|
plz: opts.input.plz,
|
||||||
|
month: intervals[0].month(),
|
||||||
|
OR: intervals.map((date) => {
|
||||||
|
return {
|
||||||
|
year: date.year(),
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!klimafaktoren) {
|
||||||
|
throw new TRPCError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message:
|
||||||
|
"Die Klimafaktoren konnten nicht geladen werden. Das kann daran liegen, dass sie für diesen Zeitraum oder Ort nicht verfügbar sind.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (klimafaktoren.length !== intervals.length) {
|
||||||
|
throw new TRPCError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message:
|
||||||
|
"Für diesen Zeitraum konnten nicht alle Klimafaktoren gefunden werden.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return klimafaktoren.map((klimafaktor) => ({
|
||||||
|
month: klimafaktor.month,
|
||||||
|
year: klimafaktor.year,
|
||||||
|
klimafaktor: klimafaktor.klimafaktor,
|
||||||
|
}));
|
||||||
|
});
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
import { ZodSchema, z } from "zod";
|
||||||
|
import { publicProcedure } from "../../../../context";
|
||||||
|
import { GebaeudeStammdaten, VerbrauchsausweisWohnen, prisma } from "@ibcornelsen/database";
|
||||||
|
|
||||||
|
export const VerbrauchsausweisWohnen2016Erstellen = publicProcedure
|
||||||
|
.meta({
|
||||||
|
openapi: {
|
||||||
|
method: "POST",
|
||||||
|
path: "/v1/verbrauchsausweis-wohnen/2016/erstellen",
|
||||||
|
contentTypes: ["application/json"],
|
||||||
|
description: "Erstellt einen neuen Verbrauchsausweis für Wohngebäude nach dem Schema der EnEV von 2016.",
|
||||||
|
tags: ["Verbrauchsausweis Wohnen"],
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.input(z.object({
|
||||||
|
baujahr_heizung: z.array(z.number()).optional(),
|
||||||
|
zusaetzliche_heizquelle: z.boolean().optional(),
|
||||||
|
brennstoff_1: z.string().max(50).optional(),
|
||||||
|
einheit_1: z.string().max(10).optional(),
|
||||||
|
brennstoff_2: z.string().max(50).optional(),
|
||||||
|
einheit_2: z.string().max(10).optional(),
|
||||||
|
startdatum: z.date().optional(),
|
||||||
|
enddatum: z.date().optional(),
|
||||||
|
verbrauch_1: z.number().optional(),
|
||||||
|
verbrauch_2: z.number().optional(),
|
||||||
|
verbrauch_3: z.number().optional(),
|
||||||
|
verbrauch_4: z.number().optional(),
|
||||||
|
verbrauch_5: z.number().optional(),
|
||||||
|
verbrauch_6: z.number().optional(),
|
||||||
|
warmwasser_enthalten: z.boolean().optional(),
|
||||||
|
warmwasser_anteil_bekannt: z.boolean().optional(),
|
||||||
|
wird_gekuehlt: z.boolean().optional(),
|
||||||
|
keller_beheizt: z.boolean().optional(),
|
||||||
|
alternative_heizung: z.boolean().optional(),
|
||||||
|
alternative_warmwasser: z.boolean().optional(),
|
||||||
|
alternative_lueftung: z.boolean().optional(),
|
||||||
|
alternative_kuehlung: z.boolean().optional(),
|
||||||
|
anteil_warmwasser_1: z.number().optional(),
|
||||||
|
anteil_warmwasser_2: z.number().optional(),
|
||||||
|
|
||||||
|
gebaeude_stammdaten: z.string().uuid().or(z.object({
|
||||||
|
gebaeudetyp: z.string().max(255).optional(), // Adjust max length as needed
|
||||||
|
gebaeudeteil: z.string().max(255).optional(), // Adjust max length as needed
|
||||||
|
baujahr_gebaeude: z.array(z.number()).optional(),
|
||||||
|
baujahr_heizung: z.array(z.number()).optional(),
|
||||||
|
baujahr_klima: z.array(z.number()).optional(),
|
||||||
|
einheiten: z.number().optional(),
|
||||||
|
flaeche: z.number().optional(),
|
||||||
|
saniert: z.boolean().optional(),
|
||||||
|
keller: z.number().optional(),
|
||||||
|
dachgeschoss: z.number().optional(),
|
||||||
|
lueftung: z.string().max(50).optional(), // Adjust max length as needed
|
||||||
|
kuehlung: z.string().max(50).optional(), // Adjust max length as needed
|
||||||
|
leerstand: z.number().optional(),
|
||||||
|
plz: z.string().max(5).optional(), // Adjust max length as needed
|
||||||
|
ort: z.string().max(50).optional(), // Adjust max length as needed
|
||||||
|
adresse: z.string().max(100).optional(), // Adjust max length as needed
|
||||||
|
|
||||||
|
zentralheizung: z.boolean().optional(),
|
||||||
|
solarsystem_warmwasser: z.boolean().optional(),
|
||||||
|
warmwasser_rohre_gedaemmt: z.boolean().optional(),
|
||||||
|
niedertemperatur_kessel: z.boolean().optional(),
|
||||||
|
brennwert_kessel: z.boolean().optional(),
|
||||||
|
heizungsrohre_gedaemmt: z.boolean().optional(),
|
||||||
|
standard_kessel: z.boolean().optional(),
|
||||||
|
waermepumpe: z.boolean().optional(),
|
||||||
|
raum_temperatur_regler: z.boolean().optional(),
|
||||||
|
photovoltaik: z.boolean().optional(),
|
||||||
|
durchlauf_erhitzer: z.boolean().optional(),
|
||||||
|
einzelofen: z.boolean().optional(),
|
||||||
|
zirkulation: z.boolean().optional(),
|
||||||
|
einfach_verglasung: z.boolean().optional(),
|
||||||
|
dreifach_verglasung: z.boolean().optional(),
|
||||||
|
fenster_teilweise_undicht: z.boolean().optional(),
|
||||||
|
doppel_verglasung: z.boolean().optional(),
|
||||||
|
fenster_dicht: z.boolean().optional(),
|
||||||
|
rolllaeden_kaesten_gedaemmt: z.boolean().optional(),
|
||||||
|
isolier_verglasung: z.boolean().optional(),
|
||||||
|
tueren_undicht: z.boolean().optional(),
|
||||||
|
tueren_dicht: z.boolean().optional(),
|
||||||
|
dachgeschoss_gedaemmt: z.boolean().optional(),
|
||||||
|
keller_decke_gedaemmt: z.boolean().optional(),
|
||||||
|
keller_wand_gedaemmt: z.boolean().optional(),
|
||||||
|
aussenwand_gedaemmt: z.boolean().optional(),
|
||||||
|
oberste_geschossdecke_gedaemmt: z.boolean().optional(),
|
||||||
|
aussenwand_min_12cm_gedaemmt: z.boolean().optional(),
|
||||||
|
dachgeschoss_min_12cm_gedaemmt: z.boolean().optional(),
|
||||||
|
oberste_geschossdecke_min_12cm_gedaemmt: z.boolean().optional(),
|
||||||
|
} satisfies ZodSchema<GebaeudeStammdaten>))
|
||||||
|
} satisfies ZodSchema<VerbrauchsausweisWohnen>))
|
||||||
|
.output(
|
||||||
|
z.object({
|
||||||
|
uid: z.string().uuid(),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.mutation(async (opts) => {
|
||||||
|
|
||||||
|
// Es kann sein, dass ein Gebäude bereits existiert. In diesem Fall wird es nicht neu erstellt, sondern nur der Verbrauchsausweis.
|
||||||
|
// Das können wir ganz einfach überprüfen, indem wir schauen, ob eine UUID für das Gebäude übergeben wurde.
|
||||||
|
if (typeof opts.input.gebaeude_stammdaten === "string") {
|
||||||
|
// Gebäude existiert bereits
|
||||||
|
const gebaeude = await prisma.gebaeudeStammdaten.findUnique({
|
||||||
|
where: {
|
||||||
|
uid: opts.input.gebaeude_stammdaten
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!gebaeude) {
|
||||||
|
throw new Error("Das Gebäude mit der übergebenen UUID existiert nicht.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const verbrauchsausweis = await prisma.verbrauchsausweisWohnen.create({
|
||||||
|
data: {
|
||||||
|
...opts.input,
|
||||||
|
gebaeude_stammdaten: {
|
||||||
|
connect: {
|
||||||
|
uid: opts.input.gebaeude_stammdaten
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return { uid: verbrauchsausweis.uid };
|
||||||
|
}
|
||||||
|
|
||||||
|
return { uid: "" };
|
||||||
|
});
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
import type { APIRoute } from "astro";
|
||||||
|
import { MissingEntityError, error } from "src/lib/APIResponse";
|
||||||
|
import { prisma } from "@ibcornelsen/database";
|
||||||
|
import { xmlVerbrauchsausweisWohnen_2016 } from "#lib/XML/VerbrauchsausweisWohnen/xmlVerbrauchsausweisWohnen_2016";
|
||||||
|
import uuid from "uuid";
|
||||||
|
|
||||||
|
export const get: APIRoute = async ({ url }) => {
|
||||||
|
const body = url.searchParams;
|
||||||
|
const uid = body.get("uid");
|
||||||
|
|
||||||
|
if (!body.has("uid") || !uid) {
|
||||||
|
return error(["Missing 'uid' in request body."]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!uuid.validate(uid)) {
|
||||||
|
return error(["'uid' in request body must follow the UUID v4 format."]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
gebaeude_stammdaten: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!ausweis) {
|
||||||
|
return MissingEntityError(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
const xml = await xmlVerbrauchsausweisWohnen_2016(ausweis);
|
||||||
|
|
||||||
|
const response = new Response(xml, {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/xml",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
|
};
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { APIRoute } from "astro";
|
import type { APIRoute } from "astro";
|
||||||
import { success, MissingPropertyError, MissingEntityError, ActionFailedError, InvalidDataError, error } from "../../lib/APIResponse";
|
import { success, MissingPropertyError, MissingEntityError, ActionFailedError, InvalidDataError, error } from "../../lib/APIResponse";
|
||||||
import { User } from "../../lib/User";
|
import { User } from "../../lib/User";
|
||||||
import { UserRegisterValidator, UserType, UserTypeValidator } from "../../lib/User/type";
|
import { UserRegisterValidator, UserType } from "../../lib/User/type";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +36,7 @@ export const put: APIRoute = async ({ request }) => {
|
|||||||
const user = await User.fromEmail(body.email);
|
const user = await User.fromEmail(body.email);
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
return error(["Email address is already being used."]);
|
return error(["Diese Email Adresse wird bereits verwendet."]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await User.create(body as UserType);
|
const result = await User.create(body as UserType);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import type { APIRoute } from "astro";
|
import type { APIRoute } from "astro";
|
||||||
import { success, MissingPropertyError, MissingEntityError, InvalidDataError, error } from "../../lib/APIResponse";
|
import { success, MissingPropertyError, MissingEntityError, error } from "../../lib/APIResponse";
|
||||||
import { ZIPInformation } from "src/lib/ZIPInformation";
|
|
||||||
import { validateAuthorizationHeader } from "src/lib/server/Authorization";
|
import { validateAuthorizationHeader } from "src/lib/server/Authorization";
|
||||||
|
import { prisma } from "@ibcornelsen/database";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ruft einen Nutzer anhand seiner uid aus der Datenbank ab.
|
* Ruft einen Nutzer anhand seiner uid aus der Datenbank ab.
|
||||||
@@ -18,11 +18,23 @@ export const get: APIRoute = async ({ request }) => {
|
|||||||
|
|
||||||
let result;
|
let result;
|
||||||
if (body.zip) {
|
if (body.zip) {
|
||||||
result = await ZIPInformation.fromZipCode(body.zip)
|
result = await prisma.postleitzahlen.findUnique({
|
||||||
|
where: {
|
||||||
|
plz: body.zip,
|
||||||
|
},
|
||||||
|
})
|
||||||
} else if (body.city) {
|
} else if (body.city) {
|
||||||
result = await ZIPInformation.fromCity(body.city)
|
result = await prisma.postleitzahlen.findMany({
|
||||||
|
where: {
|
||||||
|
stadt: body.city,
|
||||||
|
},
|
||||||
|
})
|
||||||
} else if (body.state) {
|
} else if (body.state) {
|
||||||
result = await ZIPInformation.fromState(body.state)
|
result = await prisma.postleitzahlen.findMany({
|
||||||
|
where: {
|
||||||
|
bundesland: body.state,
|
||||||
|
},
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
return MissingPropertyError(["Either 'state', 'city' or 'zip' have to exist in request body."])
|
return MissingPropertyError(["Either 'state', 'city' or 'zip' have to exist in request body."])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
---
|
|
||||||
import { changeLanguage } from "i18next";
|
|
||||||
|
|
||||||
changeLanguage("de");
|
|
||||||
|
|
||||||
console.log(Object.fromEntries(new URLSearchParams(await Astro.request.text())));
|
|
||||||
return Astro.redirect("/kundendaten");
|
|
||||||
---
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import { changeLanguage } from "i18next";
|
import { changeLanguage } from "i18next";
|
||||||
import AusweisLayout from "#layouts/AusweisLayout.astro";
|
import AusweisLayout from "#layouts/AusweisLayout.astro";
|
||||||
import Verbrauchsausweis from "#modules/Ausweise/Verbrauchsausweis.svelte";
|
import VerbrauchsausweisWohnenModule from "#modules/Ausweise/VerbrauchsausweisWohnenModule.svelte";
|
||||||
|
|
||||||
changeLanguage("de");
|
changeLanguage("de");
|
||||||
|
|
||||||
@@ -9,5 +9,5 @@ const uid = Astro.cookies.get("ausweis_uid").value;
|
|||||||
---
|
---
|
||||||
|
|
||||||
<AusweisLayout title="Verbrauchsausweis erstellen">
|
<AusweisLayout title="Verbrauchsausweis erstellen">
|
||||||
<Verbrauchsausweis client:load uid={uid} />
|
<VerbrauchsausweisWohnenModule client:load uid={uid} />
|
||||||
</AusweisLayout>
|
</AusweisLayout>
|
||||||
|
|||||||
16
src/trpc.ts
Normal file
16
src/trpc.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { createTRPCProxyClient, httpBatchLink } from '@trpc/client';
|
||||||
|
import cookies from 'js-cookie';
|
||||||
|
import type { AppRouter } from 'src/pages/api/trpc/[trpc]';
|
||||||
|
|
||||||
|
export default createTRPCProxyClient<AppRouter>({
|
||||||
|
links: [
|
||||||
|
httpBatchLink({
|
||||||
|
url: 'http://localhost:3000/api/trpc',
|
||||||
|
headers() {
|
||||||
|
return {
|
||||||
|
'Authorization': `Bearer ${cookies.get('uid')}`,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
});
|
||||||
10
test.ts
Normal file
10
test.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { AppRouter } from "src/pages/api/trpc/[trpc]"
|
||||||
|
import { createOpenApiExpressMiddleware } from "trpc-openapi"
|
||||||
|
import express from 'express';
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
app.use(createOpenApiExpressMiddleware({ router: AppRouter }));
|
||||||
|
|
||||||
|
app.listen(5555);
|
||||||
|
|
||||||
|
console.log("Server listening on port 80");
|
||||||
Reference in New Issue
Block a user