Datenbank Schema Änderungen

This commit is contained in:
Moritz Utcke
2024-01-06 14:12:01 +07:00
parent 9a6f5218d0
commit 30cc5fab63
77 changed files with 661 additions and 2385 deletions

9
database.env Normal file
View File

@@ -0,0 +1,9 @@
POSTGRES_DB=main
POSTGRES_HOST=database
POSTGRES_PORT=5432
POSTGRES_USER=main
POSTGRES_PASSWORD=hHMP8cd^N3SnzGRR
DB_CONTAINER_NAME=database
POSTGRES_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"

View File

@@ -4,11 +4,10 @@ services:
build: ./ build: ./
container_name: online-energieausweis container_name: online-energieausweis
command: bun run dev --host command: bun run dev --host
links: depends_on:
- database - database
environment: environment:
PORT: 3000 PORT: 3000
DB_CONNECTION: ${DATABASE_URL}
NODE_ENV: "development" NODE_ENV: "development"
ports: ports:
- 3000:3000 - 3000:3000
@@ -24,7 +23,7 @@ services:
env_file: env_file:
- ../database/.env - ../database/.env
ports: ports:
- "5436:5432" - "5432:5432"
networks: networks:
- postgres - postgres

View File

@@ -13,7 +13,7 @@
"format": "prettier --write .", "format": "prettier --write .",
"build:production": "astro build && bun --bun server.js", "build:production": "astro build && bun --bun server.js",
"i18n:generate": "bunx astro-i18next generate", "i18n:generate": "bunx astro-i18next generate",
"prisma:studio": "bunx prisma studio --schema=./node_modules/@ibcornelsen/database/prisma/schema.prisma" "prisma:studio": "bunx prisma studio --schema=./node_modules/@ibcornelsen/database/prisma/schema.prisma"
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
@@ -35,6 +35,7 @@
"i18next-fs-backend": "^2.1.5", "i18next-fs-backend": "^2.1.5",
"i18next-http-backend": "^2.2.1", "i18next-http-backend": "^2.2.1",
"jimp": "^0.22.8", "jimp": "^0.22.8",
"js-cookie": "^3.0.5",
"jwt-simple": "^0.5.6", "jwt-simple": "^0.5.6",
"katex": "^0.16.7", "katex": "^0.16.7",
"knex": "^2.4.2", "knex": "^2.4.2",
@@ -49,6 +50,7 @@
"zod": "^3.21.4" "zod": "^3.21.4"
}, },
"devDependencies": { "devDependencies": {
"@types/js-cookie": "^3.0.6",
"@types/uuid": "^9.0.1", "@types/uuid": "^9.0.1",
"@typescript-eslint/eslint-plugin": "^5.59.6", "@typescript-eslint/eslint-plugin": "^5.59.6",
"@typescript-eslint/parser": "^5.59.6", "@typescript-eslint/parser": "^5.59.6",

View File

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

View File

@@ -1,17 +1,12 @@
<script lang="ts"> <script lang="ts">
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis";
import AnsichtsausweisButton from "#components/AnsichtsausweisButton.svelte"; import AnsichtsausweisButton from "#components/AnsichtsausweisButton.svelte";
import DatenblattButton from "#components/DatenblattButton.svelte"; import DatenblattButton from "#components/DatenblattButton.svelte";
import HelpLabel from "#components/HelpLabel.svelte"; import HelpLabel from "#components/HelpLabel.svelte";
export let ausweis: export let ausweis: VerbrauchsausweisWohnen;
| Verbrauchsausweis
| VerbrauchsausweisGewerbe
| Bedarfsausweis;
import ImageGrid from "../ImageGrid.svelte"; import ImageGrid from "../ImageGrid.svelte";
import { VerbrauchsausweisWohnen } from "@ibcornelsen/database";
let images: (File & { data: string })[] = []; let images: (File & { data: string })[] = [];
</script> </script>

View File

@@ -1,17 +1,16 @@
<script lang="ts"> <script lang="ts">
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { Gebaeude } from "src/lib/Gebaeude";
import HelpLabel from "#components/HelpLabel.svelte"; import HelpLabel from "#components/HelpLabel.svelte";
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr"; import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr";
import { addNotification, deleteNotification } from "@ibcornelsen/ui"; import { addNotification, deleteNotification } from "@ibcornelsen/ui";
import TagInput from "../TagInput.svelte"; import TagInput from "../TagInput.svelte";
import { writable } from "svelte/store"; import { writable } from "svelte/store";
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
export let gebaeude: Gebaeude; export let gebaeude: GebaeudeStammdaten;
export let ausweis: Verbrauchsausweis; export let ausweis: VerbrauchsausweisWohnen;
$: baujahrHeizung = writable(ausweis.baujahr_heizung) $: baujahrHeizung = writable(gebaeude.baujahr_heizung || [])
$: baujahr = writable(gebaeude.baujahr); $: baujahr = writable(gebaeude.baujahr_gebaeude || []);
</script> </script>
<div class="GRB"> <div class="GRB">

View File

@@ -5,12 +5,11 @@
import DaemmungImage from "./DaemmungImage.svelte"; import DaemmungImage from "./DaemmungImage.svelte";
import FensterImage from "./FensterImage.svelte"; import FensterImage from "./FensterImage.svelte";
import Label from "../Label.svelte"; import Label from "../Label.svelte";
import { Gebaeude } from "src/lib/Gebaeude";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
export let gebaeude: Gebaeude; export let gebaeude: GebaeudeStammdaten;
export let ausweis: VerbrauchsausweisWohnen;
$: ausweis = gebaeude.ausweis || new Verbrauchsausweis()
</script> </script>
@@ -30,7 +29,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage1" name="IGheizungsanlage1"
bind:checked={gebaeude.versorgungssysteme[0]} bind:checked={gebaeude.zentralheizung}
value="ZH" value="ZH"
/>Zentral/Etage</label />Zentral/Etage</label
> >
@@ -40,7 +39,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage2" name="IGheizungsanlage2"
bind:checked={gebaeude.versorgungssysteme[1]} bind:checked={gebaeude.einzelofen}
value="EO" value="EO"
/>Einzelöfen</label />Einzelöfen</label
> >
@@ -50,7 +49,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage3" name="IGheizungsanlage3"
bind:checked={gebaeude.versorgungssysteme[2]} bind:checked={gebaeude.durchlauf_erhitzer}
value="DH" value="DH"
/>Durchlauferhitzer</label />Durchlauferhitzer</label
> >
@@ -60,7 +59,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage4" name="IGheizungsanlage4"
bind:checked={gebaeude.versorgungssysteme[3]} bind:checked={gebaeude.standard_kessel}
value="SK" value="SK"
/>Standardkessel</label />Standardkessel</label
> >
@@ -70,7 +69,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage5" name="IGheizungsanlage5"
bind:checked={gebaeude.versorgungssysteme[4]} bind:checked={gebaeude.solarsystem_warmwasser}
value="SSWW" value="SSWW"
/>Solarsystem für Warmwasser</label />Solarsystem für Warmwasser</label
> >
@@ -80,7 +79,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage6" name="IGheizungsanlage6"
bind:checked={gebaeude.versorgungssysteme[5]} bind:checked={gebaeude.waermepumpe}
value="WP" value="WP"
/>Wärmepumpe</label />Wärmepumpe</label
> >
@@ -90,7 +89,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage7" name="IGheizungsanlage7"
bind:checked={gebaeude.versorgungssysteme[6]} bind:checked={gebaeude.niedertemperatur_kessel}
value="NK" value="NK"
/>Niedertemperaturkessel</label />Niedertemperaturkessel</label
> >
@@ -100,7 +99,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage8" name="IGheizungsanlage8"
bind:checked={gebaeude.versorgungssysteme[7]} bind:checked={gebaeude.brennwert_kessel}
value="BWK" value="BWK"
/>Brennwertkessel</label />Brennwertkessel</label
> >
@@ -110,7 +109,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage9" name="IGheizungsanlage9"
bind:checked={gebaeude.versorgungssysteme[8]} bind:checked={gebaeude.warmwasser_rohre_gedaemmt}
value="WRGD" value="WRGD"
/>Warmwasserrohre gedämmt</label />Warmwasserrohre gedämmt</label
> >
@@ -120,7 +119,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage10" name="IGheizungsanlage10"
bind:checked={gebaeude.versorgungssysteme[9]} bind:checked={gebaeude.heizungsrohre_gedaemmt}
value="HRGD" value="HRGD"
/>Heizungsrohre gedämmt</label />Heizungsrohre gedämmt</label
> >
@@ -130,7 +129,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage11" name="IGheizungsanlage11"
bind:checked={gebaeude.versorgungssysteme[10]} bind:checked={gebaeude.zirkulation}
value="ZK" value="ZK"
/>Zirkulation</label />Zirkulation</label
> >
@@ -140,7 +139,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGheizungsanlage12" name="IGheizungsanlage12"
bind:checked={gebaeude.versorgungssysteme[11]} bind:checked={gebaeude.raum_temperatur_regler}
value="RTR" value="RTR"
/>Raumtemperaturregler</label />Raumtemperaturregler</label
> >
@@ -169,7 +168,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach1" name="IGfensterdach1"
bind:checked={gebaeude.fenster_dach[0]} bind:checked={gebaeude.einfach_verglasung}
value="EG" value="EG"
/>Einfachglas</label />Einfachglas</label
> >
@@ -179,7 +178,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach2" name="IGfensterdach2"
bind:checked={gebaeude.fenster_dach[1]} bind:checked={gebaeude.doppel_verglasung}
value="DF" value="DF"
/>Doppelverglasung</label />Doppelverglasung</label
> >
@@ -189,7 +188,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach3" name="IGfensterdach3"
bind:checked={gebaeude.fenster_dach[2]} bind:checked={gebaeude.isolier_verglasung}
value="IVG" value="IVG"
/>Isolierverglasung</label />Isolierverglasung</label
> >
@@ -199,7 +198,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach4" name="IGfensterdach4"
bind:checked={gebaeude.fenster_dach[3]} bind:checked={gebaeude.dreifach_verglasung}
value="PHF" value="PHF"
/>Dreifachverglasung</label />Dreifachverglasung</label
> >
@@ -209,7 +208,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach5" name="IGfensterdach5"
bind:checked={gebaeude.fenster_dach[4]} bind:checked={gebaeude.fenster_dicht}
value="FD" value="FD"
/>Alle Fenster dicht</label />Alle Fenster dicht</label
> >
@@ -219,7 +218,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach6" name="IGfensterdach6"
bind:checked={gebaeude.fenster_dach[5]} bind:checked={gebaeude.fenster_teilweise_undicht}
value="FTUD" value="FTUD"
/>Fenster teilweise undicht</label />Fenster teilweise undicht</label
> >
@@ -229,7 +228,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach7" name="IGfensterdach7"
bind:checked={gebaeude.fenster_dach[6]} bind:checked={gebaeude.tueren_dicht}
value="TD" value="TD"
/>Alle Türen dicht</label />Alle Türen dicht</label
> >
@@ -239,7 +238,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach8" name="IGfensterdach8"
bind:checked={gebaeude.fenster_dach[7]} bind:checked={gebaeude.tueren_undicht}
value="TUD" value="TUD"
/>Türen teilweise undicht</label />Türen teilweise undicht</label
> >
@@ -249,7 +248,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGfensterdach9" name="IGfensterdach9"
bind:checked={gebaeude.fenster_dach[8]} bind:checked={gebaeude.rolllaeden_kaesten_gedaemmt}
value="RKD" value="RKD"
/>Rollladenkästen gedämmt, luftdicht</label />Rollladenkästen gedämmt, luftdicht</label
> >
@@ -281,7 +280,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGwaermedaemmung1" name="IGwaermedaemmung1"
bind:checked={gebaeude.daemmung[0]} bind:checked={gebaeude.aussenwand_gedaemmt}
value="AWD" value="AWD"
/>Außenwand gedämmt</label />Außenwand gedämmt</label
> >
@@ -291,7 +290,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGwaermedaemmung2" name="IGwaermedaemmung2"
bind:checked={gebaeude.daemmung[1]} bind:checked={gebaeude.keller_wand_gedaemmt}
value="KWD" value="KWD"
/>Kelleraußenwand gedämmt</label />Kelleraußenwand gedämmt</label
> >
@@ -301,7 +300,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGwaermedaemmung3" name="IGwaermedaemmung3"
bind:checked={gebaeude.daemmung[2]} bind:checked={gebaeude.keller_decke_gedaemmt}
value="KDD" value="KDD"
/>Kellerdecke gedämmt</label />Kellerdecke gedämmt</label
> >
@@ -311,7 +310,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGwaermedaemmung4" name="IGwaermedaemmung4"
bind:checked={gebaeude.daemmung[3]} bind:checked={gebaeude.dachgeschoss_gedaemmt}
value="DGD" value="DGD"
/>Dachgeschoss gedämmt</label />Dachgeschoss gedämmt</label
> >
@@ -321,7 +320,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGwaermedaemmung5" name="IGwaermedaemmung5"
bind:checked={gebaeude.daemmung[4]} bind:checked={gebaeude.oberste_geschossdecke_gedaemmt}
value="OGDDW" value="OGDDW"
/>Oberste Geschossdecke gedämmt</label />Oberste Geschossdecke gedämmt</label
> >
@@ -331,7 +330,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGwaermedaemmung6" name="IGwaermedaemmung6"
bind:checked={gebaeude.daemmung[5]} bind:checked={gebaeude.oberste_geschossdecke_min_12cm_gedaemmt}
value="OGDD" value="OGDD"
/>Oberste Geschossdecke min. 12cm gedämmt</label />Oberste Geschossdecke min. 12cm gedämmt</label
> >

View File

@@ -1,11 +1,9 @@
<script lang="ts"> <script lang="ts">
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import ImageGrid from "../ImageGrid.svelte";; import ImageGrid from "../ImageGrid.svelte";;
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; import { VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
let images: (File & { data: string })[] = []; let images: (File & { data: string })[] = [];
export let ausweis: Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe; export let ausweis: VerbrauchsausweisWohnen;
</script> </script>
<div class="grid grid-cols-2 gap-4"> <div class="grid grid-cols-2 gap-4">

View File

@@ -1,11 +1,9 @@
<script lang="ts"> <script lang="ts">
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import ImageGrid from "../ImageGrid.svelte";; import ImageGrid from "../ImageGrid.svelte";;
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; import { VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
let images: (File & { data: string })[] = []; let images: (File & { data: string })[] = [];
export let ausweis: Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe; export let ausweis: VerbrauchsausweisWohnen;
</script> </script>
<div class="grid grid-cols-2 gap-4"> <div class="grid grid-cols-2 gap-4">

View File

@@ -1,11 +1,9 @@
<script lang="ts"> <script lang="ts">
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import ImageGrid from "../ImageGrid.svelte";; import ImageGrid from "../ImageGrid.svelte";;
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; import { VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
let images: (File & { data: string })[] = []; let images: (File & { data: string })[] = [];
export let ausweis: Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe; export let ausweis: VerbrauchsausweisWohnen;
</script> </script>
<div class="grid grid-cols-2 gap-4"> <div class="grid grid-cols-2 gap-4">

View File

@@ -1,9 +1,9 @@
<script lang="ts"> <script lang="ts">
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; import { endEnergieVerbrauch } from "#lib/Berechnungen/endEnergieVerbrauch";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; import { BedarfsausweisWohnen, GebaeudeStammdaten, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
export let ausweis: Verbrauchsausweis | VerbrauchsausweisGewerbe | Bedarfsausweis; export let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let gebaeude: GebaeudeStammdaten;
let maxPerformance = 250; let maxPerformance = 250;
@@ -40,10 +40,10 @@
let translation_2 = 0; let translation_2 = 0;
$: { $: {
(async () => { (async () => {
const endEnergieVerbrauch = (await ausweis.endEnergieVerbrauch); const energieVerbrauch = (await endEnergieVerbrauch({ ...ausweis, gebaeude_stammdaten: gebaeude}));
const primaerEnergieVerbrauch = (await ausweis.primaerEnergieBedarf); //const primaerEnergieVerbrauch = (await ausweis.primaerEnergieBedarf);
translation_1 = Math.max(0, Math.min(100, endEnergieVerbrauch / maxPerformance * 100)) translation_1 = Math.max(0, Math.min(100, energieVerbrauch / maxPerformance * 100))
translation_2 = Math.max(0, Math.min(100, primaerEnergieVerbrauch / maxPerformance * 100)) //translation_2 = Math.max(0, Math.min(100, primaerEnergieVerbrauch / maxPerformance * 100))
})() })()
} }

View File

@@ -3,9 +3,8 @@
import moment, { Moment } from "moment"; import moment, { Moment } from "moment";
import Label from "../Label.svelte"; import Label from "../Label.svelte";
import fuelList from "./fuelList"; import fuelList from "./fuelList";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { Gebaeude } from "src/lib/Gebaeude";
import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung"; import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung";
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
let availableYears = [ let availableYears = [
2018, 2019, 2018, 2019,
@@ -25,8 +24,8 @@
"Dezember", "Dezember",
]; ];
export let gebaeude: Gebaeude; export let gebaeude: GebaeudeStammdaten;
export let ausweis: Verbrauchsausweis; export let ausweis: VerbrauchsausweisWohnen;
const fuelMap: Record<string, string[]> = {}; const fuelMap: Record<string, string[]> = {};
for (const fuel of fuelList) { for (const fuel of fuelList) {
@@ -44,7 +43,7 @@
} }
} }
$: abweichung = auditVerbrauchAbweichung(gebaeude); $: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude);
</script> </script>
<div class="w-full flex flex-col gap-4"> <div class="w-full flex flex-col gap-4">

View File

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

View File

@@ -1,12 +1,10 @@
<script lang="ts"> <script lang="ts">
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import UploadImages from "./UploadImages.svelte"; import UploadImages from "./UploadImages.svelte";
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; import { VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
export let images: (File & { data: string })[] = []; export let images: (File & { data: string })[] = [];
export let max: number = 4; export let max: number = 4;
export let ausweis: Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe; export let ausweis: VerbrauchsausweisWohnen;
</script> </script>
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">

View File

@@ -1,13 +1,11 @@
<script lang="ts"> <script lang="ts">
import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; import { VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe";
export let max: number = 2; export let max: number = 2;
// Array of base64 encoded images read into the input. // Array of base64 encoded images read into the input.
export let images: (File & { data: string })[] = []; export let images: (File & { data: string })[] = [];
export let ausweis: Verbrauchsausweis | VerbrauchsausweisGewerbe | Bedarfsausweis; export let ausweis: VerbrauchsausweisWohnen;
function getAllImages(this: HTMLInputElement) { function getAllImages(this: HTMLInputElement) {
const files = this.files || []; const files = this.files || [];
@@ -66,7 +64,7 @@
data: dataURL.split(';base64,')[1], data: dataURL.split(';base64,')[1],
name: file.name, name: file.name,
kategorie: "", kategorie: "",
gebaeude_uid: ausweis.gebaeude_uid gebaeude_uid: ausweis.gebaeude_stammdaten_id
}) })
}).then(response => response.json()).then(json => { }).then(response => response.json()).then(json => {
if (json.success === false) { if (json.success === false) {

View File

@@ -1,19 +1,19 @@
import { Gebaeude } from "src/lib/Gebaeude"; import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
export function auditBedarfsausweisBenoetigt(gebaeude: Gebaeude): boolean { export function auditBedarfsausweisBenoetigt(ausweis: VerbrauchsausweisWohnen, gebaeude: GebaeudeStammdaten): boolean {
let ausweis = gebaeude.ausweis;
if (!ausweis) { if (gebaeude.baujahr_gebaeude && gebaeude.baujahr_gebaeude.length > 0) {
return false; return (
(gebaeude.baujahr_gebaeude[0] < 1978 &&
gebaeude.einheiten <= 4 &&
gebaeude.saniert == false &&
(ausweis.ausstellgrund == "Vermietung" ||
ausweis.ausstellgrund == "Sonstiges" ||
ausweis.ausstellgrund == "Verkauf")) ||
ausweis.ausstellgrund == "Neubau" ||
ausweis.ausstellgrund == "Modernisierung"
);
} }
return ( return false
(gebaeude.baujahr[0] < 1978 &&
gebaeude.einheiten <= 4 &&
gebaeude.saniert == false &&
(ausweis.ausstellgrund == "Vermietung" ||
ausweis.ausstellgrund == "Sonstiges" ||
ausweis.ausstellgrund == "Verkauf")) ||
ausweis.ausstellgrund == "Neubau" ||
ausweis.ausstellgrund == "Modernisierung"
);
} }

View File

@@ -1,14 +1,13 @@
import { Gebaeude } from "src/lib/Gebaeude";
import { AuditType, hidden } from "../audits/hidden"; import { AuditType, hidden } from "../audits/hidden";
import { GebaeudeStammdaten } from "@ibcornelsen/database";
export function auditHeizungGebaeudeBaujahr(gebaeude: Gebaeude): boolean { export function auditHeizungGebaeudeBaujahr(gebaeude: GebaeudeStammdaten): boolean {
let ausweis = gebaeude.ausweis; if ((gebaeude.baujahr_heizung && gebaeude.baujahr_heizung.length > 0) && (gebaeude.baujahr_gebaeude && gebaeude.baujahr_gebaeude.length > 0)) {
if (!ausweis) { return gebaeude.baujahr_heizung[0] > 1500 &&
return false; gebaeude.baujahr_gebaeude[0] > 1500 &&
} gebaeude.baujahr_heizung[0] < gebaeude.baujahr_gebaeude[0]
return ausweis.baujahr_anlage[0] > 1500 &&
gebaeude.baujahr[0] > 1500 &&
ausweis.baujahr_anlage[0] < gebaeude.baujahr[0]
&& !hidden.has(AuditType.HEIZUNG_GEBAEUDE_BAUJAHR) && !hidden.has(AuditType.HEIZUNG_GEBAEUDE_BAUJAHR)
}
return false;
} }

View File

@@ -1,9 +1,9 @@
import { Gebaeude } from "src/lib/Gebaeude"; import { Gebaeude } from "src/lib/Gebaeude";
import { AuditType, hidden } from "./hidden"; import { AuditType, hidden } from "./hidden";
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
export function auditVerbrauchAbweichung(gebaeude: Gebaeude): number[] { export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnen, gebaeude: GebaeudeStammdaten): number[] {
let ausweis = gebaeude.ausweis; if (gebaeude.leerstand && (gebaeude.leerstand > 0)) {
if (!ausweis || gebaeude.leerstand > 0) {
return []; return [];
} }
@@ -11,19 +11,19 @@ export function auditVerbrauchAbweichung(gebaeude: Gebaeude): number[] {
return []; return [];
} }
if (getAbweichung(ausweis.kennwerte.verbrauch_1, ausweis.kennwerte.verbrauch_2) > 0.25) { if (getAbweichung(ausweis.verbrauch_1 || 0, ausweis.verbrauch_2 || 0) > 0.25) {
return [1, 2]; return [1, 2];
} }
if (getAbweichung(ausweis.kennwerte.verbrauch_2, ausweis.kennwerte.verbrauch_3) > 0.25) { if (getAbweichung(ausweis.verbrauch_2 || 0, ausweis.verbrauch_3 || 0) > 0.25) {
return [2, 3]; return [2, 3];
} }
if (getAbweichung(ausweis.kennwerte.verbrauch_4, ausweis.kennwerte.verbrauch_5) > 0.25) { if (getAbweichung(ausweis.verbrauch_4 || 0, ausweis.verbrauch_5 || 0) > 0.25) {
return [4, 5]; return [4, 5];
} }
if (getAbweichung(ausweis.kennwerte.verbrauch_5, ausweis.kennwerte.verbrauch_6) > 0.25) { if (getAbweichung(ausweis.verbrauch_5 || 0, ausweis.verbrauch_6 || 0) > 0.25) {
return [5, 6]; return [5, 6];
} }

View File

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

View File

@@ -4,8 +4,8 @@
export let name: string; export let name: string;
export let readonly: boolean = false; export let readonly: boolean = false;
export let city: string; export let city: string | null;
export let zip: string = ""; export let zip: string | null = "";
let hideZipDropdown: boolean = true; let hideZipDropdown: boolean = true;

View File

@@ -1,5 +1,5 @@
import { Moment } from "moment"; import { Moment } from "moment";
import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; import { getHeizwertfaktor } from "../server/Heizwertfaktor";
import moment from "moment"; import moment from "moment";
import { BitChecker } from "../BitChecker"; import { BitChecker } from "../BitChecker";
import { getHeizungswerte } from "../Heizungswerte"; import { getHeizungswerte } from "../Heizungswerte";
@@ -155,12 +155,12 @@ export class Bedarfsausweis {
public get primaerEnergieBedarf(): number { public get primaerEnergieBedarf(): number {
const Endenergieverbrauch = this.endEnergieVerbrauch; const Endenergieverbrauch = this.endEnergieVerbrauch;
const brennstoff_1 = getHeizwertfaktorClient( const brennstoff_1 = getHeizwertfaktor(
this.energietraeger_1, this.energietraeger_1,
this.energietraeger_einheit_heizquelle_1 this.energietraeger_einheit_heizquelle_1
); );
return Endenergieverbrauch * brennstoff_1.primärenergiefaktor; return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
} }
public get endEnergieVerbrauch(): number { public get endEnergieVerbrauch(): number {

View File

@@ -1,5 +1,5 @@
import { getKlimafaktorenClient } from "../Klimafaktoren"; import { getKlimafaktorenClient } from "../Klimafaktoren";
import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; import { getHeizwertfaktor } from "../server/Heizwertfaktor";
import { Ausstellgrund, Ausweisart } from "./types"; import { Ausstellgrund, Ausweisart } from "./types";
import { Gebaeude } from "../Gebaeude"; import { Gebaeude } from "../Gebaeude";
import { User } from "#lib/User"; import { User } from "#lib/User";
@@ -58,12 +58,12 @@ export class Verbrauchsausweis {
return (async () => { return (async () => {
const Endenergieverbrauch = await this.endEnergieVerbrauch; const Endenergieverbrauch = await this.endEnergieVerbrauch;
const brennstoff_1 = getHeizwertfaktorClient( const brennstoff_1 = getHeizwertfaktor(
this.brennstoff_1, this.brennstoff_1,
this.einheit_1 this.einheit_1
); );
return Endenergieverbrauch * brennstoff_1.primärenergiefaktor; return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
})(); })();
} }
@@ -77,11 +77,11 @@ export class Verbrauchsausweis {
// 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.
let brennstoff_1 = getHeizwertfaktorClient( let brennstoff_1 = getHeizwertfaktor(
this.brennstoff_1, this.brennstoff_1,
this.einheit_1 this.einheit_1
); );
let brennstoff_2 = getHeizwertfaktorClient( let brennstoff_2 = getHeizwertfaktor(
this.brennstoff_2, this.brennstoff_2,
this.einheit_2 this.einheit_2
); );

View File

@@ -1,6 +1,6 @@
import { Moment } from "moment"; import { Moment } from "moment";
import { getKlimafaktorenClient } from "../Klimafaktoren"; import { getKlimafaktorenClient } from "../Klimafaktoren";
import { getHeizwertfaktorClient } from "../server/Heizwertfaktor"; import { getHeizwertfaktor } from "../server/Heizwertfaktor";
import moment from "moment"; import moment from "moment";
import { BitChecker } from "../BitChecker"; import { BitChecker } from "../BitChecker";
import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types"; import { Ausstellgrund, Ausweisart, Dachgeschoss, Lueftungskonzept } from "./types";
@@ -149,9 +149,9 @@ export class VerbrauchsausweisGewerbe {
return (async () => { return (async () => {
const Endenergieverbrauch = await this.endEnergieVerbrauch; const Endenergieverbrauch = await this.endEnergieVerbrauch;
const brennstoff_1 = getHeizwertfaktorClient(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1); const brennstoff_1 = getHeizwertfaktor(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1);
return Endenergieverbrauch * brennstoff_1.primärenergiefaktor; return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
})(); })();
} }
@@ -165,8 +165,8 @@ export class VerbrauchsausweisGewerbe {
// 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.
let brennstoff_1 = getHeizwertfaktorClient(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1); let brennstoff_1 = getHeizwertfaktor(this.energietraeger_1, this.energietraeger_einheit_heizquelle_1);
let brennstoff_2 = getHeizwertfaktorClient(this.energietraeger_2, this.energietraeger_einheit_heizquelle_2); let brennstoff_2 = getHeizwertfaktor(this.energietraeger_2, this.energietraeger_einheit_heizquelle_2);
let verbrauch_1_kwh = let verbrauch_1_kwh =
(this.energieverbrauch_1_heizquelle_1 * brennstoff_1.umrechnungsfaktor) (this.energieverbrauch_1_heizquelle_1 * brennstoff_1.umrechnungsfaktor)

View File

@@ -0,0 +1,293 @@
import { getKlimafaktoren } from "#lib/Klimafaktoren";
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
import {
GebaeudeStammdaten,
VerbrauchsausweisWohnen,
} from "@ibcornelsen/database";
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
ausweis: VerbrauchsausweisWohnen & {
gebaeude_stammdaten: GebaeudeStammdaten;
}
): number {
let faktorKeller = 1.2;
if (ausweis.keller_beheizt && (ausweis.gebaeude_stammdaten.einheiten || 1) <= 2) {
faktorKeller = 1.35;
}
return (ausweis.gebaeude_stammdaten.flaeche || 1) * faktorKeller;
}
export async function endEnergieVerbrauchVerbrauchsausweis_2016(
ausweis: VerbrauchsausweisWohnen & {
gebaeude_stammdaten: GebaeudeStammdaten;
}
) {
const date = ausweis.startdatum;
const klimafaktoren = await getKlimafaktoren(
date,
ausweis.gebaeude_stammdaten.plz
);
// Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = getHeizwertfaktor(
ausweis.brennstoff_1 as string,
ausweis.einheit_1 as string
);
let brennstoff_2 = getHeizwertfaktor(
ausweis.brennstoff_2 as string,
ausweis.einheit_2 as string
);
const energetischeNutzflaeche =
energetischeNutzflaecheVerbrauchsausweisWohnen_2016(ausweis);
let energieVerbrauchGesamt_1 =
((ausweis.verbrauch_1 || 0) +
(ausweis.verbrauch_2 || 0) +
(ausweis.verbrauch_3 || 0)) *
brennstoff_1.umrechnungsfaktor;
let energieVerbrauchGesamt_2 =
((ausweis.verbrauch_4 || 0) +
(ausweis.verbrauch_5 || 0) +
(ausweis.verbrauch_6 || 0)) *
brennstoff_2.umrechnungsfaktor;
let energieVerbrauchWarmwasser_1 = 0;
let energieVerbrauchWarmwasser_2 = 0;
let leerstandsZuschlagWarmwasser = 0;
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
let leerstand = (ausweis.gebaeude_stammdaten.leerstand || 0) / 100;
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
if (ausweis.gebaeude_stammdaten.solarsystem_warmwasser) {
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
energieVerbrauchWarmwasser_1 =
energieVerbrauchGesamt_1 *
((ausweis.anteil_warmwasser_1 || 0) / 100) *
0.6;
energieVerbrauchWarmwasser_2 =
energieVerbrauchGesamt_2 *
((ausweis.anteil_warmwasser_2 || 0) / 100) *
0.6;
} else {
// Wenn Warmwasser enthalten und Anteil bekannt und **kein** Solarsystem
energieVerbrauchWarmwasser_1 =
energieVerbrauchGesamt_1 *
((ausweis.anteil_warmwasser_1 || 0) / 100);
energieVerbrauchWarmwasser_2 =
energieVerbrauchGesamt_2 *
((ausweis.anteil_warmwasser_2 || 0) / 100);
}
leerstandsZuschlagWarmwasser =
leerstand *
(energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2);
} else {
if (ausweis.gebaeude_stammdaten.solarsystem_warmwasser) {
// Wenn Warmwasser Anteil unbekannt und Solarsystem
energieVerbrauchWarmwasser_1 = energetischeNutzflaeche * 12 * 3;
energieVerbrauchWarmwasser_2 = 0;
} else {
// Wenn Warmwasser Anteil unbekannt und **kein** Solarsystem
energieVerbrauchWarmwasser_1 = energetischeNutzflaeche * 20 * 3;
energieVerbrauchWarmwasser_2 = 0;
}
}
let energieVerbrauchHeizung_1 = energieVerbrauchGesamt_1;
let energieVerbrauchHeizung_2 = energieVerbrauchGesamt_2;
if (ausweis.warmwasser_enthalten) {
energieVerbrauchHeizung_1 -= energieVerbrauchWarmwasser_1;
energieVerbrauchHeizung_2 -= energieVerbrauchWarmwasser_2;
}
let durchschnittsKlimafaktor =
(klimafaktoren[0] + klimafaktoren[1] + klimafaktoren[2]) / 3 || 1;
let energieVerbrauchHeizungBereinigt_1 =
energieVerbrauchHeizung_1 * durchschnittsKlimafaktor;
let energieVerbrauchHeizungBereinigt_2 =
energieVerbrauchHeizung_2 * durchschnittsKlimafaktor;
let kuehlungsZuschlag = 0;
if (ausweis.wird_gekuehlt) {
kuehlungsZuschlag = 6 * 3 * energetischeNutzflaeche;
}
let durchschnittsEnergieVerbrauchHeizungBereingt =
(energieVerbrauchHeizungBereinigt_1 +
energieVerbrauchHeizungBereinigt_2) /
(3 * energetischeNutzflaeche);
let faktorDurchschnittsEnergieVerbrauchHeizungBereinigt =
-0.0028 * durchschnittsEnergieVerbrauchHeizungBereingt + 0.9147;
if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt <= 0.25) {
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 0.25;
} else if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt >= 1.0) {
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 1.0;
}
let leerstandsZuschlagHeizung =
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt *
leerstand *
(energieVerbrauchHeizungBereinigt_1 +
energieVerbrauchHeizungBereinigt_2);
let endEnergieVerbrauch_1 =
(energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1) /
(3 * energetischeNutzflaeche);
let endEnergieVerbrauch_2 =
(energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2) /
(3 * energetischeNutzflaeche);
let endEnergieVerbrauchLeerstandsZuschlag =
(leerstandsZuschlagHeizung + leerstandsZuschlagWarmwasser) /
(3 * energetischeNutzflaeche);
let endEnergieVerbrauchKuehlungsZuschlag =
kuehlungsZuschlag / (3 * energetischeNutzflaeche);
let primaerfaktorww = 0;
let primaerfaktorww_1 = 0;
if (!ausweis.warmwasser_enthalten && ausweis.gebaeude_stammdaten.durchlauf_erhitzer) {
primaerfaktorww = 1.8;
primaerfaktorww_1 = 1.8;
} else {
primaerfaktorww = brennstoff_1.primaerenergiefaktor;
primaerfaktorww_1 = brennstoff_2.primaerenergiefaktor;
}
let primaerEnergieVerbrauch_1 =
(energieVerbrauchHeizungBereinigt_1 *
brennstoff_1.primaerenergiefaktor +
energieVerbrauchWarmwasser_1 * primaerfaktorww) /
(3 * energetischeNutzflaeche);
let primaerEnergieVerbrauch_2 =
(energieVerbrauchHeizungBereinigt_2 *
brennstoff_2.primaerenergiefaktor +
energieVerbrauchWarmwasser_2 * primaerfaktorww_1) /
(3 * energetischeNutzflaeche);
let primaerEnergieVerbrauchLeerstandsZuschlag =
endEnergieVerbrauchLeerstandsZuschlag *
brennstoff_1.primaerenergiefaktor;
let primaerEnergieVerbrauchKuehlungsZuschlag =
endEnergieVerbrauchKuehlungsZuschlag * 1.8;
let co2Emissionen_1 = endEnergieVerbrauch_1 * brennstoff_1.coe;
let co2Emissionen_2 = endEnergieVerbrauch_2 * brennstoff_2.coe;
let co2EmissionenLeerstandsZuschlag =
endEnergieVerbrauchLeerstandsZuschlag * brennstoff_1.coe;
let co2EmissionenKuehlungsZuschlag =
endEnergieVerbrauchKuehlungsZuschlag * brennstoff_2.coe;
let endEnergieVerbrauchGesamt =
endEnergieVerbrauch_1 +
endEnergieVerbrauch_2 +
endEnergieVerbrauchLeerstandsZuschlag +
endEnergieVerbrauchKuehlungsZuschlag;
let primaerEnergieVerbrauchGesamt =
primaerEnergieVerbrauch_1 +
primaerEnergieVerbrauch_2 +
primaerEnergieVerbrauchLeerstandsZuschlag +
primaerEnergieVerbrauchKuehlungsZuschlag;
let co2EmissionenGesamt =
co2Emissionen_1 +
co2Emissionen_2 +
co2EmissionenLeerstandsZuschlag +
co2EmissionenKuehlungsZuschlag;
return {
brennstoff_1: brennstoff_1,
brennstoff_2: brennstoff_2,
klimafaktoren: klimafaktoren,
kuehlungsZuschlag: Math.round(kuehlungsZuschlag),
durchschnittsKlimafaktor: Math.round(durchschnittsKlimafaktor),
ausweis: ausweis,
anteil_heizung_1: 1 - (ausweis.anteil_warmwasser_1 || 0) / 100,
anteil_heizung_2: 1 - (ausweis.anteil_warmwasser_2 || 0) / 100,
verbrauch_1_kwh: Math.round(
(ausweis.verbrauch_1 || 0) * brennstoff_1.umrechnungsfaktor
),
verbrauch_2_kwh: Math.round(
(ausweis.verbrauch_2 || 0) * brennstoff_1.umrechnungsfaktor
),
verbrauch_3_kwh: Math.round(
(ausweis.verbrauch_3 || 0) * brennstoff_1.umrechnungsfaktor
),
verbrauch_4_kwh: Math.round(
(ausweis.verbrauch_4 || 0) * brennstoff_2.umrechnungsfaktor
),
verbrauch_5_kwh: Math.round(
(ausweis.verbrauch_5 || 0) * brennstoff_2.umrechnungsfaktor
),
verbrauch_6_kwh: Math.round(
(ausweis.verbrauch_6 || 0) * brennstoff_2.umrechnungsfaktor
),
energetische_nutzfläche: Math.round(energetischeNutzflaeche),
leerstand: leerstand,
leerstandsZuschlagHeizung: Math.round(leerstandsZuschlagHeizung),
leerstandsZuschlagWarmwasser: Math.round(leerstandsZuschlagWarmwasser),
endEnergieVerbrauchLeerstandsZuschlag: Math.round(
endEnergieVerbrauchLeerstandsZuschlag
),
endEnergieVerbrauchKuehlungsZuschlag: Math.round(
endEnergieVerbrauchKuehlungsZuschlag
),
coeeffkg: co2EmissionenGesamt,
energieVerbrauchGesamt_1: Math.round(energieVerbrauchGesamt_1),
energieVerbrauchGesamt_2: Math.round(energieVerbrauchGesamt_2),
energieVerbrauchWarmwasser_1: Math.round(energieVerbrauchWarmwasser_1),
energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2),
energieVerbrauchHeizung_1: energieVerbrauchHeizung_1,
energieVerbrauchHeizung_2: energieVerbrauchHeizung_2,
anteil_warmwasser_1: (ausweis.anteil_warmwasser_1 || 0) / 100,
anteil_warmwasser_2: (ausweis.anteil_warmwasser_2 || 0) / 100,
energieVerbrauchHeizungBereinigt_1: Math.round(
energieVerbrauchHeizungBereinigt_1
),
energieVerbrauchHeizungBereinigt_2: Math.round(
energieVerbrauchHeizungBereinigt_2
),
durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(
durchschnittsEnergieVerbrauchHeizungBereingt
),
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt
),
endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1),
endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2),
primaerEnergieVerbrauch_1: Math.round(primaerEnergieVerbrauch_1),
primaerEnergieVerbrauch_2: Math.round(primaerEnergieVerbrauch_2),
primaerEnergieVerbrauchLeerstandsZuschlag: Math.round(
primaerEnergieVerbrauchLeerstandsZuschlag
),
primaerEnergieVerbrauchKuehlungsZuschlag: Math.round(
primaerEnergieVerbrauchKuehlungsZuschlag
),
co2Emissionen_1: co2Emissionen_1,
co2Emissionen_2: co2Emissionen_2,
co2EmissionenLeerstandsZuschlag: co2EmissionenLeerstandsZuschlag,
co2EmissionenKuehlungsZuschlag: co2EmissionenKuehlungsZuschlag,
co2EmissionenGesamt: Math.round(co2EmissionenGesamt),
endEnergieVerbrauchGesamt: Math.round(endEnergieVerbrauchGesamt),
primaerEnergieVerbrauchGesamt: Math.round(
primaerEnergieVerbrauchGesamt
),
};
}

View File

@@ -0,0 +1,95 @@
import { getKlimafaktoren } from "#lib/Klimafaktoren";
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2023(ausweis: VerbrauchsausweisWohnen & { gebaeude_stammdaten: GebaeudeStammdaten }): number {
return (
ausweis.gebaeude_stammdaten.flaeche *
(ausweis.gebaeude_stammdaten.keller ? 1.35 : 1.2)
);
}
export async function endEnergieVerbrauchVerbrauchsausweis_2023(ausweis: VerbrauchsausweisWohnen & { gebaeude_stammdaten: GebaeudeStammdaten }): Promise<number> {
const date = ausweis.startdatum;
const klimafaktoren = await getKlimafaktoren(
date,
ausweis.gebaeude_stammdaten.plz
);
// Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = getHeizwertfaktor(
ausweis.brennstoff_1,
ausweis.einheit_1
);
let brennstoff_2 = getHeizwertfaktor(
ausweis.brennstoff_2,
ausweis.einheit_2
);
let verbrauch_1_kwh =
ausweis.verbrauch_1 * brennstoff_1.umrechnungsfaktor;
let verbrauch_2_kwh =
ausweis.verbrauch_2 * brennstoff_1.umrechnungsfaktor;
let verbrauch_3_kwh =
ausweis.verbrauch_3 * brennstoff_1.umrechnungsfaktor;
let verbrauch_4_kwh =
ausweis.verbrauch_4 * brennstoff_2.umrechnungsfaktor;
let verbrauch_5_kwh =
ausweis.verbrauch_5 * brennstoff_2.umrechnungsfaktor;
let verbrauch_6_kwh =
ausweis.verbrauch_6 * brennstoff_2.umrechnungsfaktor;
const energetischeNutzflaeche = energetischeNutzflaecheVerbrauchsausweisWohnen_2016(ausweis);
let warmwasserZuschlag = 0;
let leerstandsZuschlag = 0;
let kuehlungsZuschlag = 0;
if (ausweis.anteil_warmwasser_1 == 0) {
warmwasserZuschlag = 20 * energetischeNutzflaeche * 3;
}
if (ausweis.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) *
(ausweis.gebaeude_stammdaten.leerstand / 100)) /
durchschnittsKlimafaktor;
}
if (ausweis.gebaeude_stammdaten.energiequelle_2_nutzung[3]) {
kuehlungsZuschlag = 6 * energetischeNutzflaeche * 3;
}
let anteil_heizung = 1 - ausweis.anteil_warmwasser_1 / 100;
let anteil_warmwasser = ausweis.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 /
energetischeNutzflaeche;
return Energieverbrauchskennwert;
}

View File

@@ -0,0 +1,6 @@
import { BedarfsausweisWohnen, GebaeudeStammdaten, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen & { gebaeude_stammdaten: GebaeudeStammdaten }): Promise<number> {
return (await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis)).endEnergieVerbrauchGesamt;
}

View File

@@ -1,12 +1,14 @@
import moment from "moment"; import moment from "moment";
import { memoize } from "./Memoization"; import { memoize } from "./Memoization";
import { prisma } from "@ibcornelsen/database";
import { l } from "astro-i18n";
export const getKlimafaktorenClient = memoize<Promise<[number, number, number]>>(async (date: Date, zip: string) => { export const getKlimafaktorenClient = memoize<Promise<[number, number, number]>>(async (date: Date, plz: string) => {
if (!zip || !date) { if (!plz || !date) {
return [0, 0, 0]; return [0, 0, 0];
} }
const response = await fetch(`/api/klimafaktor?date=${moment(date).format("YYYY-MM-DD")}&accuracy=years&zip=${zip}`, { const response = await fetch(`/api/klimafaktor?date=${moment(date).format("YYYY-MM-DD")}&accuracy=years&zip=${plz}`, {
method: "GET", method: "GET",
headers: { headers: {
"Content-Type": "application/json" "Content-Type": "application/json"
@@ -21,6 +23,34 @@ export const getKlimafaktorenClient = memoize<Promise<[number, number, number]>>
return Object.values(json.data) as [number, number, number]; return Object.values(json.data) as [number, number, number];
}); });
export const getKlimafaktorenServer = memoize(async (date: Date, zip: string) => { 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;

View File

@@ -1,10 +1,10 @@
import moment, { Moment } from "moment"; import moment, { Moment } from "moment";
import { db } from "../shared"; import { prisma } from "@ibcornelsen/database";
export async function getClimateFactor(dates: Moment[], zip: string): Promise<number[][] | null> { export async function getClimateFactor(dates: Moment[], zip: string): Promise<({ zip: string } & Record<string, number>) | null> {
const formattedDates = dates.map(date => { const formattedDates = dates.map(date => {
let d = moment(date).format("MM_YYYY"); let d = moment(date).format("MM_YYYY");
return `d_${d} as ${d}` return `d_${d}`
}); });
if (dates.length == 0) { if (dates.length == 0) {
@@ -14,9 +14,20 @@ export async function getClimateFactor(dates: Moment[], zip: string): Promise<nu
return null; return null;
} }
let result; let result: ({ zip: string } & Record<string, number>) | null = null;
try { try {
result = await db<number[][]>("climate_factors").select(formattedDates).where("zip", zip).first(); result = await prisma.klimafaktoren.findUnique({
select: {
zip: true,
...formattedDates.reduce((acc, cur) => {
acc[cur] = true;
return acc;
}, {} as Record<string, boolean>)
},
where: {
zip
}
}) as ({ zip: string } & Record<string, number>) | null;
} catch(e) { } catch(e) {
return null; return null;
} }

View File

@@ -1,4 +1,4 @@
import { db, prisma } from "../shared"; import { prisma } from "@ibcornelsen/database";
import { UserRegisterValidator, UserType, UserTypeValidator } from "./type"; import { UserRegisterValidator, UserType, UserTypeValidator } from "./type";
import { v4 as uuid } from "uuid"; import { v4 as uuid } from "uuid";
import { hashPassword } from "../Password"; import { hashPassword } from "../Password";

View File

@@ -1,7 +1,7 @@
import { Benutzer, Rechnungen, VerbrauchsausweisWohnen } from "@ibcornelsen/database"; import { Benutzer, Rechnungen, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
import { Gebaeude } from "src/lib/Gebaeude"; import { Gebaeude } from "src/lib/Gebaeude";
import { getKlimafaktorenClient } from "src/lib/Klimafaktoren"; import { getKlimafaktorenClient } from "src/lib/Klimafaktoren";
import { getHeizwertfaktorClient } from "src/lib/server/Heizwertfaktor"; import { getHeizwertfaktor } from "src/lib/server/Heizwertfaktor";
export class Verbrauchsausweis implements Partial<VerbrauchsausweisWohnen & { benutzer: Benutzer, rechnung: Rechnungen }> { export class Verbrauchsausweis implements Partial<VerbrauchsausweisWohnen & { benutzer: Benutzer, rechnung: Rechnungen }> {
@@ -49,12 +49,12 @@ export class Verbrauchsausweis implements Partial<VerbrauchsausweisWohnen & { be
return (async () => { return (async () => {
const Endenergieverbrauch = await this.endEnergieVerbrauch; const Endenergieverbrauch = await this.endEnergieVerbrauch;
const brennstoff_1 = getHeizwertfaktorClient( const brennstoff_1 = getHeizwertfaktor(
this.brennstoff_1, this.brennstoff_1,
this.einheit_1 this.einheit_1
); );
return Endenergieverbrauch * brennstoff_1.primärenergiefaktor; return Endenergieverbrauch * brennstoff_1.primaerenergiefaktor;
})(); })();
} }
@@ -68,11 +68,11 @@ export class Verbrauchsausweis implements Partial<VerbrauchsausweisWohnen & { be
// 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.
let brennstoff_1 = getHeizwertfaktorClient( let brennstoff_1 = getHeizwertfaktor(
this.brennstoff_1, this.brennstoff_1,
this.einheit_1 this.einheit_1
); );
let brennstoff_2 = getHeizwertfaktorClient( let brennstoff_2 = getHeizwertfaktor(
this.brennstoff_2, this.brennstoff_2,
this.einheit_2 this.einheit_2
); );

View File

@@ -1,11 +1,11 @@
import fuelList from "#components/Ausweis/fuelList"; import fuelList from "#components/Ausweis/fuelList";
export const getHeizwertfaktorClient = function(energietraeger: string, einheit: string): { export const getHeizwertfaktor = function(energietraeger: string, einheit: string): {
coe: number, coe: number,
energietraeger: string, energietraeger: string,
einheit: string, einheit: string,
umrechnungsfaktor: number, umrechnungsfaktor: number,
primärenergiefaktor: number primaerenergiefaktor: number
} { } {
for (const fuel of fuelList) { for (const fuel of fuelList) {
if (fuel[0] == energietraeger && fuel[1] == einheit) { if (fuel[0] == energietraeger && fuel[1] == einheit) {
@@ -14,7 +14,7 @@ export const getHeizwertfaktorClient = function(energietraeger: string, einheit:
energietraeger: fuel[0], energietraeger: fuel[0],
einheit: fuel[1], einheit: fuel[1],
umrechnungsfaktor: fuel[2], umrechnungsfaktor: fuel[2],
primärenergiefaktor: fuel[3] primaerenergiefaktor: fuel[3]
}; };
} }
} }
@@ -24,6 +24,6 @@ export const getHeizwertfaktorClient = function(energietraeger: string, einheit:
energietraeger: "", energietraeger: "",
einheit: "", einheit: "",
umrechnungsfaktor: 0, umrechnungsfaktor: 0,
primärenergiefaktor: 0 primaerenergiefaktor: 0
}; };
} }

View File

@@ -1,13 +0,0 @@
import knex, { Knex } from "knex";
export { prisma } from "@ibcornelsen/database"
export function dbOpen(): Knex {
const db = knex({
client: 'pg',
connection: process.env.DB_CONNECTION
})
return db;
}
export const db = dbOpen();

View File

@@ -6,21 +6,20 @@
import Verbrauch from "#components/Ausweis/Verbrauch.svelte"; import Verbrauch from "#components/Ausweis/Verbrauch.svelte";
import Label from "#components/Label.svelte"; import Label from "#components/Label.svelte";
import Ausweisart from "#components/Ausweis/Ausweisart.svelte"; import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import ZipSearch from "../ZIPSearch.svelte"; import ZipSearch from "#components/ZIPSearch.svelte";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import moment from "moment"; import moment from "moment";
import BilderZusatzsysteme from "../Ausweis/BilderZusatzsysteme.svelte"; import BilderZusatzsysteme from "#components/Ausweis/BilderZusatzsysteme.svelte";
import { Gebaeude } from "src/lib/Gebaeude";
import { RawNotificationWrapper, RawNotification, notifications } from "@ibcornelsen/ui"; import { RawNotificationWrapper, RawNotification, notifications } from "@ibcornelsen/ui";
import { auditHeizungGebaeudeBaujahr } from "./audits/HeizungGebaeudeBaujahr"; import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr";
import { AuditType, hidden } from "./audits/hidden"; import { AuditType, hidden } from "#components/Verbrauchsausweis/audits/hidden";
import { auditBedarfsausweisBenoetigt } from "./audits/BedarfsausweisBenoetigt"; import { auditBedarfsausweisBenoetigt } from "#components/Verbrauchsausweis/audits/BedarfsausweisBenoetigt";
import { auditVerbrauchAbweichung } from "./audits/VerbrauchAbweichung"; import { auditVerbrauchAbweichung } from "#components/Verbrauchsausweis/audits/VerbrauchAbweichung";
import { GebaeudeStammdaten, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
export let uid: string = ""; export let uid: string = "";
let gebaeude = new Gebaeude(); let gebaeude: GebaeudeStammdaten = {} as GebaeudeStammdaten;
let ausweis = new Verbrauchsausweis(); let ausweis: VerbrauchsausweisWohnen = {} as VerbrauchsausweisWohnen;
if (uid) { if (uid) {
async () => { async () => {
const result = await fetch(`/api/verbrauchsausweis?uid=${uid}`, { const result = await fetch(`/api/verbrauchsausweis?uid=${uid}`, {
@@ -30,33 +29,32 @@
const json = await result.json(); const json = await result.json();
if (json.success) { if (json.success) {
gebaeude = new Gebaeude(json.data.gebaeude); gebaeude = json.data.gebaeude
ausweis = new Verbrauchsausweis(json.data.ausweis); ausweis = json.data.ausweis
} }
}; };
} }
function automatischAusfüllen() { function automatischAusfüllen() {
gebaeude.baujahr = [1962]; gebaeude.baujahr_gebaeude = [1962];
ausweis.baujahr_heizung = [1952]; gebaeude.baujahr_heizung = [1952];
gebaeude.saniert = true; gebaeude.saniert = true;
gebaeude.einheiten = 1; gebaeude.einheiten = 1;
ausweis.ausstellgrund = "Vermietung"; ausweis.ausstellgrund = "Vermietung";
ausweis.verbrauch_1 = 15000; ausweis.verbrauch_1 = 15000;
ausweis.verbrauch_2 = 14000; ausweis.verbrauch_2 = 14000;
ausweis.verbrauch_3 = 16000; ausweis.verbrauch_3 = 16000;
gebaeude.wohnflaeche = 152; gebaeude.flaeche = 152;
gebaeude.keller_beheizt = true; ausweis.keller_beheizt = true;
ausweis.brennstoff_1 = "Erdgas H"; ausweis.brennstoff_1 = "Erdgas H";
ausweis.einheit_1 = "kWh"; ausweis.einheit_1 = "kWh";
ausweis.anteil_warmwasser_1 = 18; ausweis.anteil_warmwasser_1 = 18;
ausweis.startdatum = moment("12.01.2019").toDate(); ausweis.startdatum = moment("12.01.2019").toDate();
gebaeude.plz = "21039"; gebaeude.plz = "21039";
gebaeude.ort = "Hamburg"; gebaeude.ort = "Hamburg";
gebaeude.strasse = "Curslacker Deich 170"; gebaeude.adresse = "Curslacker Deich 170";
gebaeude.gebaeudeteil = "Gesamtgebäude"; gebaeude.gebaeudeteil = "Gesamtgebäude";
ausweis.gebaeude_stammdaten = gebaeude
gebaeude = gebaeude; gebaeude = gebaeude;
ausweis = ausweis; ausweis = ausweis;
} }
@@ -68,7 +66,7 @@
<Progressbar progress={0} /> <Progressbar progress={0} />
</div> </div>
<PerformanceScore bind:ausweis /> <PerformanceScore bind:ausweis bind:gebaeude />
</div> </div>
<form method="post" action="/verbrauchsausweis/erstellen"> <form method="post" action="/verbrauchsausweis/erstellen">
@@ -91,7 +89,7 @@
<Label>A - Prüfung der Ausweisart</Label> <Label>A - Prüfung der Ausweisart</Label>
<Ausweisart bind:gebaeude={gebaeude} bind:ausweis={ausweis} /> <Ausweisart bind:gebaeude bind:ausweis />
<hr /> <hr />
@@ -116,7 +114,7 @@
required required
data-msg-minlength="min. 5 Zeichen" data-msg-minlength="min. 5 Zeichen"
data-msg-maxlength="max. 40 Zeichen" data-msg-maxlength="max. 40 Zeichen"
bind:value={gebaeude.strasse} bind:value={gebaeude.adresse}
/> />
</div> </div>
</div> </div>
@@ -161,7 +159,7 @@
autocomplete="off" autocomplete="off"
data-rule-minlength="2" data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen" data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude.wohnflaeche} bind:value={gebaeude.flaeche}
/> />
</div> </div>
</div> </div>
@@ -173,7 +171,7 @@
<select <select
name="IGkeller" name="IGkeller"
required required
bind:value={gebaeude.keller_beheizt} bind:value={ausweis.keller_beheizt}
> >
<option>Bitte auswählen</option> <option>Bitte auswählen</option>
<option value={false}>nicht vorhanden</option> <option value={false}>nicht vorhanden</option>
@@ -202,7 +200,7 @@
<Label>C - Eingabe von 3 zusammenhängenden Verbrauchsjahren</Label> <Label>C - Eingabe von 3 zusammenhängenden Verbrauchsjahren</Label>
<div class="GRB"> <div class="GRB">
<Verbrauch bind:gebaeude={gebaeude} bind:ausweis={ausweis} /> <Verbrauch bind:gebaeude bind:ausweis />
</div> </div>
<hr /> <hr />
@@ -276,7 +274,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGversorgungssysteme1" name="IGversorgungssysteme1"
bind:checked={gebaeude.energiequelle_2_nutzung[0]} bind:checked={ausweis.alternative_heizung}
value="Heizung" value="Heizung"
/>Heizung</label />Heizung</label
> >
@@ -284,7 +282,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGversorgungssysteme2" name="IGversorgungssysteme2"
bind:checked={gebaeude.energiequelle_2_nutzung[1]} bind:checked={ausweis.alternative_warmwasser}
value="Warmwasser" value="Warmwasser"
/>Warmwasser</label />Warmwasser</label
> >
@@ -292,7 +290,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGversorgungssysteme3" name="IGversorgungssysteme3"
bind:checked={gebaeude.energiequelle_2_nutzung[2]} bind:checked={ausweis.alternative_lueftung}
value="Lüftung" value="Lüftung"
/>Lüftung</label />Lüftung</label
> >
@@ -300,7 +298,7 @@
><input ><input
type="checkbox" type="checkbox"
name="IGversorgungssysteme4" name="IGversorgungssysteme4"
bind:checked={gebaeude.energiequelle_2_nutzung[3]} bind:checked={ausweis.alternative_kuehlung}
value="Kühlung" value="Kühlung"
/>Kühlung</label />Kühlung</label
> >
@@ -439,7 +437,7 @@
>F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des >F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes</Label Gebäudes</Label
> >
<BilderZusatzsysteme gebaeude={gebaeude} /> <BilderZusatzsysteme {gebaeude} {ausweis} />
<hr /> <hr />
<div class="flex flex-row justify-between"> <div class="flex flex-row justify-between">
<Hilfe /> <Hilfe />
@@ -456,7 +454,7 @@
</RawNotification> </RawNotification>
{/each} {/each}
{#if auditBedarfsausweisBenoetigt(gebaeude)} {#if auditBedarfsausweisBenoetigt(ausweis, gebaeude)}
<RawNotification <RawNotification
notification={{ notification={{
message: "Bedarfsausweis benötigt!", message: "Bedarfsausweis benötigt!",
@@ -491,7 +489,7 @@
</RawNotification> </RawNotification>
{/if} {/if}
{#if auditVerbrauchAbweichung(gebaeude).length > 0} {#if auditVerbrauchAbweichung(ausweis, gebaeude).length > 0}
<RawNotification <RawNotification
notification={{ notification={{
message: "Plausibilitätsprüfung", message: "Plausibilitätsprüfung",
@@ -505,9 +503,9 @@
type: "warning", type: "warning",
}} }}
> >
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung( Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(ausweis,
gebaeude gebaeude
)[0]} und {auditVerbrauchAbweichung(gebaeude)[1]} beträgt mehr als 25% )[0]} und {auditVerbrauchAbweichung(ausweis, gebaeude)[1]} beträgt mehr als 25%
und sie haben keinen Leerstand angegeben. Sind sie sich sicher, dass und sie haben keinen Leerstand angegeben. Sind sie sich sicher, dass
das stimmt? das stimmt?
</RawNotification> </RawNotification>

View File

@@ -1,17 +1,7 @@
<script lang="ts"> <script lang="ts">
import i18next, { t } from "i18next"; import Cookies from "js-cookie"
import HttpApi from "i18next-http-backend";
import cookie from "cookiejs";
import { addNotification } from "@ibcornelsen/ui"; import { addNotification } from "@ibcornelsen/ui";
i18next.use(HttpApi).init({
lng: i18next.language,
fallbackLng: "de",
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json",
}
})
let email: string; let email: string;
let password: string; let password: string;
@@ -32,8 +22,8 @@
path: "/", path: "/",
expires: json.data.expires expires: json.data.expires
} }
cookie.set("token", json.data.token, options); Cookies.set("token", json.data.token, options);
cookie.set("expires", json.data.expires, options); Cookies.set("expires", json.data.expires, options);
localStorage.setItem("token", json.data.token); localStorage.setItem("token", json.data.token);
localStorage.setItem("expires", json.data.expires); localStorage.setItem("expires", json.data.expires);
window.location.href = "/user"; window.location.href = "/user";
@@ -56,6 +46,7 @@
<div> <div>
<h4>Email</h4> <h4>Email</h4>
<input <input
class="px-2.5 py-1.5 rounded-lg border bg-gray-50"
type="text" type="text"
placeholder="Email" placeholder="Email"
name="email" name="email"
@@ -66,6 +57,7 @@
<div> <div>
<h4>Passwort</h4> <h4>Passwort</h4>
<input <input
class="px-2.5 py-1.5 rounded-lg border bg-gray-50"
type="password" type="password"
placeholder="********" placeholder="********"
name="password" name="password"

View File

@@ -36,7 +36,7 @@
<input <input
type="text" type="text"
placeholder="Email" placeholder="Email"
class="formInput" class="px-2.5 py-1.5 rounded-lg border bg-gray-50"
bind:value={email} bind:value={email}
required required
/> />
@@ -46,7 +46,7 @@
<input <input
type="password" type="password"
placeholder="********" placeholder="********"
class="formInput" class="px-2.5 py-1.5 rounded-lg border bg-gray-50"
bind:value={passwort} bind:value={passwort}
required required
/> />

View File

@@ -1,9 +1,8 @@
import { prisma } from "@ibcornelsen/database";
import type { APIRoute } from "astro"; import type { APIRoute } from "astro";
import { ActionFailedError, MissingEntityError, error, success } from "src/lib/APIResponse"; import { ActionFailedError, MissingEntityError, error, success } from "src/lib/APIResponse";
import { Ausweis } from "src/lib/Ausweis/Ausweis"; import { Ausweis } from "src/lib/Ausweis/Ausweis";
import { Energiekennwerte } from "src/lib/Energiekennwerte";
import { Gebaeude } from "src/lib/Gebaeude"; import { Gebaeude } from "src/lib/Gebaeude";
import { db } from "src/lib/shared";
import { z } from "zod"; import { z } from "zod";
const AusweisUploadChecker = z.object({ const AusweisUploadChecker = z.object({
@@ -83,54 +82,35 @@ export const post: APIRoute = async ({ request }) => {
return error(validation.error.issues); return error(validation.error.issues);
} }
let gebaeude, kennwerte, ausweis; let gebaeude, ausweis;
if (body.gebaeude_uid) { if (body.gebaeude_uid) {
gebaeude = await db("gebaeude") gebaeude = await prisma.gebaeudeStammdaten.update({
.update(body.gebaeude) where: {
.where("uid", body.gebaeude_uid) uid: body.gebaeude_uid,
.returning(["uid", "id"]); },
data: body.gebaeude,
})
} else { } else {
gebaeude = await db("gebaeude") gebaeude = await prisma.gebaeudeStammdaten.create({
.insert(body.gebaeude) data: body.gebaeude,
.returning(["uid", "id"]); })
} }
if (!gebaeude) { if (!gebaeude) {
return ActionFailedError(); return ActionFailedError();
} }
if (body.kennwerte_uid) {
kennwerte = await db("energiekennwerte")
.update({ ...body.kennwerte, gebaeude_id: gebaeude[0].id })
.where("uid", body.kennwerte_uid)
.returning(["uid", "id"]);
} else {
kennwerte = await db("energiekennwerte")
.insert({ ...body.kennwerte, gebaeude_id: gebaeude[0].id })
.returning(["uid", "id"]);
}
if (!kennwerte) {
return ActionFailedError();
}
if (body.ausweis_uid) { if (body.ausweis_uid) {
ausweis = await db("energieausweise") ausweis = await prisma.verbrauchsausweisWohnen.update({
.update({ where: {
...body.ausweis, uid: body.ausweis_uid,
gebaeude_id: gebaeude[0].id, },
energiekennwerte_id: kennwerte[0].id, data: body.ausweis,
}) })
.where("uid", body.ausweis_uid)
.returning(["uid", "id"]);
} else { } else {
ausweis = await db("energieausweise") ausweis = await prisma.verbrauchsausweisWohnen.create({
.insert({ data: body.ausweis,
...body.ausweis, })
gebaeude_id: gebaeude[0].id,
energiekennwerte_id: kennwerte[0].id,
})
.returning(["uid", "id"]);
} }
if (!ausweis) { if (!ausweis) {
@@ -138,9 +118,8 @@ export const post: APIRoute = async ({ request }) => {
} }
return success({ return success({
ausweis: ausweis[0], ausweis: ausweis,
kennwerte: kennwerte[0], gebaeude: gebaeude,
gebaeude: gebaeude[0],
}); });
}; };
@@ -153,29 +132,18 @@ export const get: APIRoute = async ({ request }) => {
return error(validation.error.issues); return error(validation.error.issues);
} }
let result = await db<{ gebaeude: Gebaeude, kennwerte: Energiekennwerte, ausweis: Ausweis}>("gebaeude") const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
.select([ where: {
db.raw("(json_agg(gebaeude)->0) AS gebaeude"), uid: body.uid,
db.raw("(json_agg(energiekennwerte)->0) AS kennwerte"), },
db.raw("(json_agg(energieausweise)->0) AS ausweis"), include: {
]) gebaeude_stammdaten: true,
.leftJoin( }
"energiekennwerte", })
"energiekennwerte.gebaeude_id",
"gebaeude.id"
)
.leftJoin(
"energieausweise",
"energieausweise.gebaeude_id",
"gebaeude.id"
)
.where("gebaeude.uid", body.uid)
.groupBy("gebaeude.id")
.first();
if (!result) { if (!ausweis) {
return MissingEntityError("gebäude"); return MissingEntityError("gebäude");
} }
return result; return success(ausweis);
}; };

View File

@@ -4,7 +4,7 @@ import {
error, error,
success, success,
} from "src/lib/APIResponse"; } from "src/lib/APIResponse";
import { db, prisma } from "src/lib/shared"; import { prisma } from "@ibcornelsen/database";
export const get: APIRoute = async ({ url }) => { export const get: APIRoute = async ({ url }) => {
const body = url.searchParams const body = url.searchParams

View File

@@ -5,7 +5,7 @@ import {
} from "src/lib/APIResponse"; } from "src/lib/APIResponse";
import * as path from "path"; import * as path from "path";
import * as fs from "fs"; import * as fs from "fs";
import { prisma } from "src/lib/shared"; import { prisma } from "@ibcornelsen/database";
export const get: APIRoute = async ({ url }) => { export const get: APIRoute = async ({ url }) => {
const body = url.searchParams const body = url.searchParams

View File

@@ -9,7 +9,7 @@ import * as jimp from "jimp";
import { z } from "zod"; import { z } from "zod";
import * as path from "path"; import * as path from "path";
import * as fs from "fs"; import * as fs from "fs";
import { db, prisma } from "src/lib/shared"; import { prisma } from "@ibcornelsen/database";
const ImageUploadChecker = z.object({ const ImageUploadChecker = z.object({
data: z.string(), data: z.string(),

View File

@@ -1,6 +1,6 @@
import type { APIRoute } from "astro"; import type { APIRoute } from "astro";
import { success, MissingPropertyError, error } from "../../lib/APIResponse"; import { success, MissingPropertyError, error } from "../../lib/APIResponse";
import { validatePassword, hashPassword } from "../../lib/Password"; import { validatePassword } from "../../lib/Password";
import { User } from "../../lib/User"; import { User } from "../../lib/User";
import moment from "moment"; import moment from "moment";
import { encodeToken } from "../../lib/JsonWebToken"; import { encodeToken } from "../../lib/JsonWebToken";

View File

@@ -1,10 +0,0 @@
---
import { changeLanguage } from "i18next";
import AusweisLayout from "#layouts/AusweisLayout.astro";
import BedarfsausweisContent from "#components/Bedarfsausweis/BedarfsausweisContent.svelte";
changeLanguage("en");
---
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
<BedarfsausweisContent client:load></BedarfsausweisContent>
</AusweisLayout>

View File

@@ -1,6 +0,0 @@
---
import Page from "../../verbrauchsausweis/erstellen.astro"
const { props } = Astro
---
<Page {...props} />

View File

@@ -1,6 +0,0 @@
---
import Page from "../../verbrauchsausweis/index.astro"
const { props } = Astro
---
<Page {...props} />

View File

@@ -1,11 +0,0 @@
---
import { changeLanguage } from "i18next";
import Layout from "#layouts/Layout.astro";
changeLanguage("en");
---
<Layout title="Für Entwickler - IBCornelsen">
<h1>Warum das IBCornelsen?</h1>
<p>Unser Unternehmen bietet eine weite Auswahl an Schnittstellen und damit einhergehenden Daten. Unsere API bietet uneingeschränkten Zugang zu Immobilien, Verbrauchsdaten und vielem Weiteren.</p>
</Layout>

View File

@@ -1,8 +0,0 @@
---
import { changeLanguage } from "i18next";
import Layout from "#layouts/Layout.astro";
changeLanguage("en");
---
<Layout title="FAQ - IBCornelsen"></Layout>

View File

@@ -1,366 +0,0 @@
---
import { changeLanguage } from "i18next";
import { BoxWithHeading } from "@ibcornelsen/ui";
import Widget from "#components/Widget.svelte";
import Layout from "#layouts/Layout.astro";
import FeatureCard from "#components/FeatureCard.svelte";
changeLanguage("en");
---
<Layout title="Energieausweis online erstellen - Online Energieausweis">
<h1>Energieausweis online erstellen</h1>
<Widget client:load />
<h2>GEG gilt ab 1. Mai 2021 und löst die EnEV ab</h2>
<BoxWithHeading heading="Folgende Punkte ändern sich:">
<ul>
<li>
Erhöhte Sorgfaltspflicht bei der Erstellung der Energieausweise.
Insbesondere zur Einschätzung der Modernisierungsempfehlungen
werden jetzt Fotos der relevanten Bereiche von Dach, Fenster,
Heizung und Außenwand benötigt.
</li>
<li>
Die Primärenergiefaktoren zur Ermittlung des Gebäudekennwerts
werden jetzt direkt im GEG (§22 Primärenergiefaktoren) geregelt.
Dadurch wird mehr Transparenz und Nachvollziehbarkeit
geschaffen. Auch findet die Verwendung von Biogas aus dem
Erdgasnetz jetzt angemessen Berücksichtigung.
</li>
<li>
Die lokale Erzeugung von Strom über eine PV-Anlage wird besser
berücksichtigt und kann vom Jahres-Primärenergiebedarf abgezogen
werden (bis 45%).
</li>
<li>
Die Angabe der CO2-Emission des Gebäudes im Energieausweis wird
verplichtend eingeführt.
</li>
</ul>
</BoxWithHeading>
<h2>
Energieausweis nach aktueller GEG (vormals EnEV) geprüft vom Diplom
Ingenieur
</h2>
<div class="right-img">
<img
title="Energieausweis online erstellen"
src="images/Bedarfsausweis-Wohngebaeude-Beispiel.jpg"
alt="Energieausweis online erstellen"
/>
</div>
<hr />Sie möchten Ihren <strong>Energieausweis online erstellen</strong>?
Auf dieser Seite finden Sie alle nötigen Informationen hierzu. Sollten Sie
sich nicht sicher sein <a href="/energieausweis-welcher-energieausweis.php"
>welchen Energieausweis</a
> Sie benötigen, können Sie sich bei uns umfassend informieren. Wir haben fürs
Sie alle wichtigen Informationen rund um die GEG und zur
<a href="/energieausweis-pflicht.php">Energieausweis Pflicht</a> zusammengetragen.
Zusätzlich haben wir die entscheidenden Informationen auf übersichtlichen Merkblättern
im PDF Format zum Download zusammengefasst. Sollten Sie noch Fragen zum Thema
Energieausweis online erstellen haben, stehen wir Ihnen gerne telefonisch unter
folgender Nummer: 040/209 339 850 zur Verfügung.
<hr />Mit dem <strong>Energieausweis</strong> werden Wohngebäude und Nichtwohngebäude
nach den Vorgaben der Energieeinsparverordnung <a
href="/enev-zusammenfassung">EnEV</a
>
energetisch bewertet. Das <a href="https://www.dibt.de/" target="blank"
>DIBt</a
>
(Deutsches Institut für Bautechnik) regelt die Grundsätze zur Ausstellung, Berechnung
und der Qualitätssicherung. Der Energieausweis beschreibt die entsprechenden
Energiekennwerte auf einer Farbskala, grün (A+/Effizienzhaus), gelb (D) und rot
(H / unsaniert). Es wird grundsätzlich zwischen zwei Energieausweisarten unterschieden:
<hr />
<div
style="border-left: 5px solid #f5b68c; border-right: 5px solid #f5b68c;"
>
<ul id="start_ul">
<li>
Der verbrauchsbasierte Energieausweis wird als <a
title="Verbrauchsausweis"
href="/verbrauchsausweis/"
><strong>Verbrauchsausweis</strong></a
> bezeichnet. Dies ist der „kleine“ Energieausweis und kann bei Vermietung
und Verkauf in den meisten Fällen verwendet werden. Hier gehts direkt
zum Eingabeformular <br />→ <a
title="Energieausweis online erstellen - Verbrauchsausweis"
href="/energieausweis-erstellen/verbrauchsausweis-erstellen.php"
>Energieausweis online erstellen</a
>
<hr />
</li>
<li>
Der bedarfsbasierte Energieausweis wird als <a
title="Bedarfsausweis"
href="/bedarfsausweis/"><strong>Bedarfsausweis</strong></a
>bezeichnet. Dies ist der „große“ Energieausweis und kann immer
verwendet werden. Bei Neubau und Modernisierung ist er zwingend
vorgeschrieben. Hier gehts direkt zum Eingabeformular <br />→ <a
title="Energieausweis online erstellen - Bedarfsausweis"
href="/energieausweis-erstellen/bedarfsausweis-erstellen.php"
>Energieausweis online erstellen</a
>
</li>
</ul>
</div>
<hr />
<div class="grid grid-cols-3 gap-4">
<FeatureCard heading="Verbrauchsausweis Wohngebäude" price={45} href="/verbrauchsausweis">
<div class="rpt_feature">Unsere Leistungen:</div>
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
<div class="rpt_feature">Registrierung beim DiBt</div>
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
<div class="rpt_feature">telefonische Beratung</div>
</FeatureCard>
<FeatureCard heading="Bedarfsausweis Wohngebäude" price={75} href="/bedarfsausweis">
<div class="rpt_feature">Unsere Leistungen:</div>
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
<div class="rpt_feature">Registrierung beim DiBt</div>
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
<div class="rpt_feature">telefonische Beratung</div>
</FeatureCard>
<FeatureCard heading="Verbrauchsausweis Gewerbe" price={65} href="/verbrauchsausweis-gewerbe">
<div class="rpt_feature">Unsere Leistungen:</div>
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
<div class="rpt_feature">Registrierung beim DiBt</div>
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
<div class="rpt_feature">telefonische Beratung</div>
</FeatureCard>
</div>
<hr />
<h2>Unterschied: Verbrauchsausweis und Bedarfsausweis</h2> Grundsätzlich unterscheidet
man beim Energieausweis zwischen Verbrauchsausweis und Bedarfsausweis.<h3>
Was ist ein Verbrauchsausweis?
</h3>
Der Verbrauchsausweis gibt den Energieverbrauch der Gebäudebewohner in den vergangenen
drei Jahren für Heizung und Warmwasserbereitung an. Um den <a
href="/enev-zusammenfassung#§-19-EnEV"
>Energieverbrauchskennwert zu ermitteln</a
>, wird der tatsächliche Energieverbrauch mithilfe eines standortbezogenen
Klimafaktors bereinigt. Der Durchschnittswert wird dann durch die sogenannte
energetische Gebäudenutzfläche (An) geteilt. So führt beispielsweise ein
hoher Verbrauch in einem einzelnen harten Winter nicht zu einer schlechteren
Beurteilung des Gebäudes. Der tatsächliche Energieverbrauch in einem Gebäude
oder einer Wohnung kann aufgrund des Witterungseinflusses vom
Energieverbrauchskennwert abweichen.Das Ergebnis im Verbrauchsausweis ist
stark vom individuellen Nutzungsverhalten der Bewohner abhängig. Wird in
einem energetisch schlechten Gebäude kaum geheizt, so kann der
Energieausweis trotzdem sehr gut ausfallen.<h3>
Was ist ein Bedarfsausweis?
</h3> Der Bedarfsausweis entsteht auf Grundlage einer technischen <a
href="/enev-zusammenfassung#§-18-EnEV"
>Analyse der Bausubstanz und der Heizungsanlage eines Gebäudes</a
> und ist unabhängig vom individuellen Nutzerverhalten. Die Farbverlaufsskala
im Bedarfsausweis weist zwei verschiedene Werte aus, die sehr unterschiedlich
ausfallen können einen Wert für den Endenergiebedarf und einen für den Primärenergiebedarf.
Zusätzlich wird noch ein Kennwert für die energetische Qualität der Gebäudehülle
dargestellt.Der Energiebedarf gibt die nach technischen Regeln berechnete, vom
konkreten Gebäude jährlich benötigte Energiemenge für Heizung, Lüftung und Warmwasserbereitung
an. Dabei werden bei der Berechnung standardisierte Randbedingungen beispielsweise
eine Innentemperatur von 19 Grad im beheizten Bereich des Gebäudes zugrunde
gelegt. Am Endenergiebedarf sollten sich Hausbewohner orientieren, wenn sie ihren
künftigen Energieverbrauch und die Energiekosten abschätzen wollen.Der Primärenergiebedarf
bildet die Gesamtenergieeffizienz eines Gebäudes ab. Er berücksichtigt neben
der Endenergie auch die so genannte „Vorkette“ (Erkundung, Gewinnung, Verteilung,
Umwandlung) der jeweils eingesetzten Energieträger (z.B. Heizöl, Gas, Strom,
erneuerbare Energien).Besonders niedrig fällt der Primärenergiebedarf aus, wenn
erneuerbare Energien (solare Strahlungsenergie, Geothermie, Energie aus Biomasse)
für die Energieversorgung im Gebäude eingesetzt werden. Am Primärenergiebedarf
können Verbraucher erkennen, wie umweltfreundlich ihr Gebäude ist.<h3>
Fazit Verbrauchsausweis / Bedarfsausweis
</h3> Geht es um den tatsächlichen Verbrauch der Energie, der den Aufwand für
Heizung und zentrale Warmwasserbereitung der vergangenen drei Jahre berücksichtigt,
wird der Energieverbrauchskennwert für den Verbrauchsausweis ermittelt. Bei gewerblichen
Objekten wird zusätzlich der Verbrauch für Beleuchtung und Klimatisierung mit
eingerechnet. Anhand der Zeiträume und der Lage des Gebäudes (Postleitzahl) werden
diese Daten ausgewertet und sowohl zeit-, als auch klimabereinigt zur Bewertung
der vorhandenen energetischen Qualität herangezogen.Für das Ausstellen des Bedarfsausweis
wird der rechnerische Energiebedarf unter standardisierten Randbedingungen benötigt.
Daten rund um Bausubstanz, Gebäudehülle und Heizanlage fließen in die Berechnung
mit ein. Bedarfsausweise widerspiegeln die tatsächliche energetische Qualität
eines Gebäudes damit wesentlich besser als die Verbrauchsausweise.
<hr />
<div class="start_infobox" title="Verbrauchsausweis Wohngebäude">
<div class="start_infobox_inside IB_VA_WG">
<img
alt="Energieausweis online erstellen - Verbrauchsausweis"
title="Energieausweis online erstellen - Verbrauchsausweis"
class="start_infobox_img"
src="/images/energieausweis-online-erstellen-verbrauchsausweis.png"
/>
<div class="title">Verbrauchsausweis Wohngebäude</div>
<hr />
<ul>
<li>
3 zusammenhängende Heizenergieverbräuche müssen eingegeben
werden.
</li>
<li>
Wohnfläche, Baujahr Gebäude und Baujahr Heizung müssen
eingegeben werden.
</li>
<li>
<div class="start_infobox_link">
<a
title="Verbrauchsausweis"
href="/verbrauchsausweis/verbrauchsausweis-wohngebaeude.php"
>Verbrauchsausweis</a
>
bei fast allen Gebäuden möglich. (Baujahr &gt; 1977 - Vermietung/Verkauf)
</div>
</li>
</ul>
<div class="start_infobox_button">
<a
title="Verbrauchsausweis erstellen"
href="/energieausweis-erstellen/verbrauchsausweis-erstellen.php"
>Jetzt Verbrauchsausweis erstellen</a
>
</div>
</div>
</div>
<div class="start_infobox BA-WG" title="Bedarfssausweis Wohngebäude">
<div class="start_infobox_inside">
<img
alt="Energieausweis online erstellen - Bedarfsausweis"
title="Energieausweis online erstellen - Bedarfsausweis"
class="start_infobox_img"
src="/images/energieausweis-online-erstellen-verbrauchsausweis.png"
/>
<div class="title">Bedarfsausweis Wohngebäude</div>
<hr />
<ul>
<li>
Die verwendete Heizungsanlage (Standardkessel,
Brennwertkessel, etc.) muß eingegeben werden.
</li>
<li>
Grundrissgeometrie sowie Baujahr Heizung und Gebäude müssen
eingegeben werden.
</li>
<li>
<a
title="Bedarfsausweis"
href="/bedarfsausweis/bedarfsausweis-wohngebaeude.php"
>Bedarfsausweis</a
> bei allen Gebäuden möglich. Die Berechnung ist umfangreicher
und besser vergleichbar.
</li>
</ul>
<div class="start_infobox_button">
<a
title="Bedarfsausweis erstellen"
href="/energieausweis-erstellen/bedarfsausweis-erstellen.php"
>Jetzt Bedarfsausweis erstellen</a
>
</div>
</div>
</div>
<div class="start_infobox VANW_WG" title="Bedarfsausweis Gewerbe">
<div class="start_infobox_inside">
<img
alt="Energieausweis online erstellen - Bedarfsausweis Gewerbe"
title="Energieausweis online erstellen - Bedarfsausweis Gewerbe"
class="start_infobox_img"
src="/images/energieausweis-online-erstellen-verbrauchsausweis-gewerbe.png"
/>
<div class="title">Bedarfsausweis Gewerbe</div>
<hr />
<ul>
<li>
Aktuelle Grundriss- und Ansichtspläne werden für die
Zonierung benötigt.
</li>
<li>
Baubeschreibung (z.B. aus der Baugenehmigung) mit Angabe der
verwendeten Baustoffe und TGA.
</li>
<li>
Angabe vom Baujahr der Heizung, Gebäude und Klimaanlage.
</li>
<li>
<a
title="Bedarfsausweis Gewerbe"
href="/bedarfsausweis/bedarfsausweis-gewerbe.php"
>Bedarfsausweis Gewerbe</a
> bei allen Nichtwohngebäuden möglich (kann immmer verwendet
werden).
</li>
</ul>
<div class="start_infobox_button">
<a
href="/energieausweis-erstellen/bedarfsausweis-gewerbe-anfragen.php"
title="Bedarfsausweis Gewerbe anfragen"
>Jetzt Bedarfsausweis Gewerbe anfragen</a
>
</div>
</div>
</div>
<hr />
<h2>Energieausweis online erstellen</h2> Soll Wohneigentum veräußert oder bauliches
Teileigentum zum Erwerb angeboten werden, muss dem möglichen Käufer oder Leasingnehmer
auf Verlangen unverzüglich ein
<a href="enev-zusammenfassung#§-16a-EnEV">Energieausweis gezeigt werden</a>.
In den meisten Fällen ist hier ein Verbrauchsausweis ausreichend. Auch
Mietern oder Pächtern soll der Energieausweis unmittelbaren Aufschluss über
die energetischen Bedingungen des Gebäudes aufzeigen.Kommt der Anbieter der
offerierten Immobilie diesem Auftrag nach der Energieeinsparverordnung nicht
nach, drohen Bußgelder bis zu 15 000 Euro. Als Ausnahmen gelten Gebäude mit
nicht mehr als 50 m² Fläche sowie Baudenkmäler (<a
href="enev-zusammenfassung#§-16-EnEV">§ 16 Abs. 4 EnEV</a
>).Die Deutsche Energie-Agentur GmbH (<a
href="https://www.dena.de/"
target="blank">dena</a
>) empfiehlt bei Wohngebäuden generell den Bedarfsausweis. Er erlaubt eine
nutzerunabhängige Bewertung des Gebäudes. Zusätzlich können bei der
Erstellung eines Bedarfsausweises die Empfehlungen für Modernisierungen auf
der Basis einer technischen Analyse des Gebäudes ermittelt werden.
<hr />
<h2>Zusammenfassung: Was ist ein Energieausweis?</h2>
<ul id="start_ul_1">
<li>
Der Gesetzgeber hat zwei Arten des Energieausweises bestimmt: Den
Verbrauchsausweis und den Bedarfsausweis.
</li>
<li>
Je nach Gebäudeart, Baujahr, Nutzungsart gilt es verschiedene
Kriterien für den Energieausweis zu beachten.
</li>
<li>
Der Energieausweis ist ein Mittel, das als Starter für
Energiesparmaßnahmen definiert werden kann.
</li>
<li>
Mit Hilfe des Energieausweises kann sich der Marktwert einer
Immobilie erhöhen.
</li>
<li>
Der Energieausweis offenbart bauliche Mängel, die eine
Energieverschwendung mit sich bringen.
</li>
<li>
Im Energieausweis werden Sanierungs- bzw. Modernisierungsvorschläge
dokumentiert.
</li>
<li>
Anhand des Energiepasses lässt sich der energetische Zustand
verschiedener Gebäude miteinander vergleichen.
</li>
</ul>
</Layout>

View File

@@ -1,11 +0,0 @@
---
import { changeLanguage } from "i18next";
import Kaufabschluss from "#components/Kaufabschluss/Kaufabschluss.svelte";
import AusweisLayout from "#layouts/AusweisLayout.astro";
changeLanguage("en");
---
<AusweisLayout title="Kaufabschluss Verbrauchsausweis - IBCornelsen">
<Kaufabschluss client:load></Kaufabschluss>
</AusweisLayout>

View File

@@ -1,12 +0,0 @@
---
import { changeLanguage } from "i18next";
import Kundendaten from "#components/Ausweis/Kundendaten.svelte";
import AusweisLayout from "#layouts/AusweisLayout.astro";
changeLanguage("en");
---
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
<Kundendaten client:load></Kundendaten>
</AusweisLayout>

View File

@@ -1,19 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import LoginView from "../../components/LoginView.svelte";
import Layout from "../../layouts/Layout.astro";
changeLanguage("en");
const token = Astro.cookies.get("token").value;
const expires = Astro.cookies.get("expires").number();
const now = moment().unix();
if (token && now < expires) {
return Astro.redirect(`/user`);
}
---
<Layout title="Login">
<LoginView client:only></LoginView>
</Layout>

View File

@@ -1,9 +0,0 @@
---
import { changeLanguage } from "i18next";
changeLanguage("en");
Astro.cookies.delete("token");
Astro.cookies.delete("expires");
return Astro.redirect("/");
---

View File

@@ -1,247 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import { Ausweis } from "src/lib/Ausweis";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import Checkbox from "#components/Checkbox.svelte";
import PDFHeader from "#components/PDF/PDFHeader.svelte";
import PDFSectionHeader from "#components/PDF/PDFSectionHeader.svelte";
import PDFLayout from "#layouts/PDFLayout.astro";
changeLanguage("en");
const base64 = Astro.url.searchParams.get("base64");
if (!base64) {
return Astro.redirect("/404");
}
const ausweis = Verbrauchsausweis.fromBase64(base64);
if (!ausweis) {
return Astro.redirect("/404");
}
---
<PDFLayout title="Ansichtsausweis">
<div class="flex flex-col gap-20">
<div class="flex flex-col gap-2">
<PDFHeader></PDFHeader>
<PDFSectionHeader number={1}>
<p class="text-xs">
Gültig bis: <span
>{
moment().add("10", "years").locale("de").format("DD. MMM. YYYY")
}</span>
</p>
<p class="text-xs">Ausweis ID <span>1293819</span></p>
<p class="text-xs">
Registriernummer wird nach Zahlungseingang vergeben
</p>
</PDFSectionHeader>
<div
class="border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg"
>
<h2>Gebäude</h2>
<div class="flex flex-col">
<div class="flex flex-row">
<table>
<tr>
<td>Gebäudetyp</td>
<td>{ausweis.objekt_typ}</td>
</tr>
<tr>
<td>Adresse</td>
<td>{ausweis.objekt_strasse}</td>
</tr>
<tr>
<td>Gebäudeteil</td>
<td>{ausweis.objekt_gebaeudeteil}</td>
</tr>
<tr>
<td>Baujahr Gebäude ³</td>
<td>{ausweis.baujahr_gebaeude}</td>
</tr>
<tr>
<td
>Baujahr Wärmeerzeuger <sup>3</sup>
<sup>4</sup></td
>
<td>{ausweis.baujahr_anlage}</td>
</tr>
<tr>
<td>Anzahl Wohnungen</td>
<td>{ausweis.anzahl_einheiten}</td>
</tr>
<tr>
<td>Gebäudenutzfläche (A<sub>N</sub>)</td>
<td>
<table>
<tr>
<td>192m²</td>
<td
class="flex flex-row items-center h-full w-full gap-2 pl-2"
>
<input type="checkbox" />
nach § 19 EnEV aus der Wohnfläche ermittelt
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td
>Wesentliche Energieträger für<br /> Heizung und
Warmwasser <sup>3</sup></td
>
<td>Erdgas, BraunkohleBraunkohle, Strommix</td>
</tr>
</table>
<div class="w-[35%]">
<img src="" alt="" />
</div>
</div>
<div>
<table></table>
</div>
</div>
</div>
<div class="box">
<h2>
Hinweise zu den Angaben über die energetische Qualität des
Gebäudes
</h2>
<div class="bg-white w-full">
<p>
Die energetische Qualität eines Gebäudes kann durch die
Berechnung des <strong>Energiebedarfs</strong> unter Annahme
von standardisierten Randbedingungen oder durch die Auswertung
des <strong>Energieverbrauchs</strong> ermittelt werden. Als
Bezugsfläche dient die energetische Gebäudenutzfläche nach der
EnEV, die sich in der Regel von den allgemeinen Wohnflächenangaben
unterscheidet. Die angegebenen Vergleichswerte sollen überschlägige
Vergleiche ermöglichen (<strong
>Erläuterungen - siehe Seite 5</strong
>). Teil des Energieausweises sind die
Modernisierungsempfehlungen (Seite 4).
</p>
<Checkbox checked={true}>
Der Energieausweis wurde auf der Grundlage von Berechnungen
des <strong>Energiebedarfs</strong> erstellt (Energiebedarfsausweis).
Die Ergebnisse sind auf <strong>Seite 2</strong> dargestellt.
Zusätzliche Informationen zum Verbrauch sind freiwillig.
</Checkbox>
<Checkbox checked={false}>
Der Energieausweis wurde auf der Grundlage von Auswertungen
des <strong>Energieverbrauchs</strong> erstellt (Energieverbrauchsausweis).
Die Ergebnisse sind auf <strong>Seite 3</strong> dargestellt.
</Checkbox>
<div class="flex flex-row justify-between items-center w-[80%]">
<p>Datenerhebung Bedarf/Verbrauch durch</p>
<Checkbox checked={true}>Eigentümer</Checkbox>
<Checkbox checked={false}>Aussteller</Checkbox>
</div>
<Checkbox>
Dem Energieausweis sind zusätzliche Informationen zur
energetischen Qualität beigefügt (freiwillige Angabe).
</Checkbox>
</div>
</div>
<div class="box">
<h2>Hinweise zur Verwendung des Energieausweises</h2>
<p class="bg-white">
Der Energieausweis dient lediglich der Information. Die Angaben
im Energieausweis beziehen sich auf das gesamte Wohngebäude oder
den oben bezeichneten Gebäudeteil. Der Energieausweis ist
lediglich dafür gedacht, einen überschlägigen Vergleich von
Gebäuden zu ermöglichen.
</p>
</div>
<div class="flex flex-row gap-2">
<div class="bg-pdf-yellow-light rounded-lg p-2 w-full h-20">
<p>Aussteller:</p>
</div>
<div class="bg-pdf-yellow-light rounded-lg p-2 w-full h-20"></div>
</div>
<div class="flex flex-row flex-wrap">
<p>
<sup>1</sup> Datum der angewendeten EnEV, gegebenenfalls angewendeten
Änderungsverordnung zur EnEV
</p>
<p>
<sup>2</sup> Bei nicht rechtzeitiger Zuteilung der Registriernummer
(§ 17 Absatz 4 Satz 4 und 5 EnEV) ist das Datum der Antragstellung
einzutragen; die Registriernummer ist nach deren Eingang nachträglich
einzusetzen.
</p>
<p><sup>3</sup> Mehrfachangaben möglich</p>
<p><sup>4</sup> bei Wärmenetzen Baujahr der Übergabestation</p>
</div>
</div>
<div class="flex flex-col gap-2">
<PDFHeader></PDFHeader>
<PDFSectionHeader number={2}>
<p>Berechneter Energiebedarf des Gebäudes</p>
</PDFSectionHeader>
<div
class="box"
>
<h2>Energiebedarf</h2>
<div class="bg-white w-full flex flex-col">
<div class="flex flex-col items-end text-center">
<div class="flex flex-row">
<span class="bg-gray-300 p-0.5">200</span>
<span>kg/(m²a)</span>
</div>
<span>CO² Treibhausgas Emissionen</span>
</div>
</div>
</div>
</div>
</div>
</PDFLayout>
<style is:global>
table {
@apply w-full h-full;
}
td > table td {
@apply px-0 py-0 border-t-0 border-b-0;
}
td:has(table) {
@apply p-0;
}
td > table td:first-child {
@apply border-l-0;
}
td > table td:last-child {
@apply border-r-0;
}
td {
@apply border border-black px-1 text-xs py-0.5;
}
td:not(:first-child) {
@apply bg-white;
}
h2 {
@apply font-bold text-sm;
}
p,
label {
@apply text-xs;
}
.box {
@apply border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg;
}
.box > * {
@apply px-1 py-0.5;
}
</style>

View File

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

View File

@@ -1,6 +0,0 @@
---
import Page from "../../bedarfsausweis/index.astro"
const { props } = Astro
---
<Page {...props} />

View File

@@ -1,19 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import RegisterView from "../../components/RegisterView.svelte";
import Layout from "../../layouts/Layout.astro";
changeLanguage("en");
const token = Astro.cookies.get("token").value;
const expires = Astro.cookies.get("expires").number();
const now = moment().unix();
if (token && now < expires) {
return Astro.redirect("/user");
}
---
<Layout title="Login">
<RegisterView client:only></RegisterView>
</Layout>

View File

@@ -1,38 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import { decodeToken } from "#lib/JsonWebToken";
import { User } from "#lib/User";
import UserLayout from "#layouts/UserLayout.astro";
import AusweisCard from "#components/AusweisCard.svelte";
import { Verbrauchsausweis } from "#lib/Ausweis/Verbrauchsausweis";
changeLanguage("en");
const token = Astro.cookies.get("token").value;
const expires = Astro.cookies.get("expires").number();
const now = moment().unix();
if (!token || now > expires) {
Astro.cookies.delete("token");
Astro.cookies.delete("expires");
return Astro.redirect(`/login`);
}
const parsed = decodeToken(token);
const user = await User.fromUID(parsed.uid);
if (!user) {
Astro.cookies.delete("token");
Astro.cookies.delete("expires");
return Astro.redirect(`/login`);
}
---
<UserLayout title="Dashboard">
<h1>Willkommen zurück <b>{user.email}</b></h1>
<h2>Ihre Ausweise</h2>
<div class="grid grid-flow-row grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
<AusweisCard client:load hidden={true} i={0} ausweis={new Verbrauchsausweis()}></AusweisCard>
<AusweisCard client:load hidden={true} i={1} ausweis={new Verbrauchsausweis()}></AusweisCard>
<AusweisCard client:load hidden={true} i={2} ausweis={new Verbrauchsausweis()}></AusweisCard>
</div>
</UserLayout>

View File

@@ -1,11 +0,0 @@
---
import { changeLanguage } from "i18next";
import AusweisLayout from "#layouts/AusweisLayout.astro";
import VerbrauchsausweisGewerbeContent from "#components/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeContent.svelte";
changeLanguage("en");
---
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen">
<VerbrauchsausweisGewerbeContent client:load></VerbrauchsausweisGewerbeContent>
</AusweisLayout>

View File

@@ -1,8 +0,0 @@
---
import { changeLanguage } from "i18next";
changeLanguage("en");
console.log(Object.fromEntries(new URLSearchParams(await Astro.request.text())));
return Astro.redirect("/kundendaten");
---

View File

@@ -1,13 +0,0 @@
---
import { changeLanguage } from "i18next";
import AusweisLayout from "#layouts/AusweisLayout.astro";
import VerbrauchsausweisContent from "#components/Verbrauchsausweis/VerbrauchsausweisContent.svelte";
changeLanguage("en");
const uid = Astro.cookies.get("ausweis_uid").value;
---
<AusweisLayout title="Verbrauchsausweis erstellen">
<VerbrauchsausweisContent client:load uid={uid} />
</AusweisLayout>

View File

@@ -1,10 +0,0 @@
---
import { changeLanguage } from "i18next";
import AusweisLayout from "#layouts/AusweisLayout.astro";
import BedarfsausweisContent from "#components/Bedarfsausweis/BedarfsausweisContent.svelte";
changeLanguage("fr");
---
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
<BedarfsausweisContent client:load></BedarfsausweisContent>
</AusweisLayout>

View File

@@ -1,11 +0,0 @@
---
import { changeLanguage } from "i18next";
import Layout from "#layouts/Layout.astro";
changeLanguage("fr");
---
<Layout title="Für Entwickler - IBCornelsen">
<h1>Warum das IBCornelsen?</h1>
<p>Unser Unternehmen bietet eine weite Auswahl an Schnittstellen und damit einhergehenden Daten. Unsere API bietet uneingeschränkten Zugang zu Immobilien, Verbrauchsdaten und vielem Weiteren.</p>
</Layout>

View File

@@ -1,8 +0,0 @@
---
import { changeLanguage } from "i18next";
import Layout from "#layouts/Layout.astro";
changeLanguage("fr");
---
<Layout title="FAQ - IBCornelsen"></Layout>

View File

@@ -1,366 +0,0 @@
---
import { changeLanguage } from "i18next";
import { BoxWithHeading } from "@ibcornelsen/ui";
import Widget from "#components/Widget.svelte";
import Layout from "#layouts/Layout.astro";
import FeatureCard from "#components/FeatureCard.svelte";
changeLanguage("fr");
---
<Layout title="Energieausweis online erstellen - Online Energieausweis">
<h1>Energieausweis online erstellen</h1>
<Widget client:load />
<h2>GEG gilt ab 1. Mai 2021 und löst die EnEV ab</h2>
<BoxWithHeading heading="Folgende Punkte ändern sich:">
<ul>
<li>
Erhöhte Sorgfaltspflicht bei der Erstellung der Energieausweise.
Insbesondere zur Einschätzung der Modernisierungsempfehlungen
werden jetzt Fotos der relevanten Bereiche von Dach, Fenster,
Heizung und Außenwand benötigt.
</li>
<li>
Die Primärenergiefaktoren zur Ermittlung des Gebäudekennwerts
werden jetzt direkt im GEG (§22 Primärenergiefaktoren) geregelt.
Dadurch wird mehr Transparenz und Nachvollziehbarkeit
geschaffen. Auch findet die Verwendung von Biogas aus dem
Erdgasnetz jetzt angemessen Berücksichtigung.
</li>
<li>
Die lokale Erzeugung von Strom über eine PV-Anlage wird besser
berücksichtigt und kann vom Jahres-Primärenergiebedarf abgezogen
werden (bis 45%).
</li>
<li>
Die Angabe der CO2-Emission des Gebäudes im Energieausweis wird
verplichtend eingeführt.
</li>
</ul>
</BoxWithHeading>
<h2>
Energieausweis nach aktueller GEG (vormals EnEV) geprüft vom Diplom
Ingenieur
</h2>
<div class="right-img">
<img
title="Energieausweis online erstellen"
src="images/Bedarfsausweis-Wohngebaeude-Beispiel.jpg"
alt="Energieausweis online erstellen"
/>
</div>
<hr />Sie möchten Ihren <strong>Energieausweis online erstellen</strong>?
Auf dieser Seite finden Sie alle nötigen Informationen hierzu. Sollten Sie
sich nicht sicher sein <a href="/energieausweis-welcher-energieausweis.php"
>welchen Energieausweis</a
> Sie benötigen, können Sie sich bei uns umfassend informieren. Wir haben fürs
Sie alle wichtigen Informationen rund um die GEG und zur
<a href="/energieausweis-pflicht.php">Energieausweis Pflicht</a> zusammengetragen.
Zusätzlich haben wir die entscheidenden Informationen auf übersichtlichen Merkblättern
im PDF Format zum Download zusammengefasst. Sollten Sie noch Fragen zum Thema
Energieausweis online erstellen haben, stehen wir Ihnen gerne telefonisch unter
folgender Nummer: 040/209 339 850 zur Verfügung.
<hr />Mit dem <strong>Energieausweis</strong> werden Wohngebäude und Nichtwohngebäude
nach den Vorgaben der Energieeinsparverordnung <a
href="/enev-zusammenfassung">EnEV</a
>
energetisch bewertet. Das <a href="https://www.dibt.de/" target="blank"
>DIBt</a
>
(Deutsches Institut für Bautechnik) regelt die Grundsätze zur Ausstellung, Berechnung
und der Qualitätssicherung. Der Energieausweis beschreibt die entsprechenden
Energiekennwerte auf einer Farbskala, grün (A+/Effizienzhaus), gelb (D) und rot
(H / unsaniert). Es wird grundsätzlich zwischen zwei Energieausweisarten unterschieden:
<hr />
<div
style="border-left: 5px solid #f5b68c; border-right: 5px solid #f5b68c;"
>
<ul id="start_ul">
<li>
Der verbrauchsbasierte Energieausweis wird als <a
title="Verbrauchsausweis"
href="/verbrauchsausweis/"
><strong>Verbrauchsausweis</strong></a
> bezeichnet. Dies ist der „kleine“ Energieausweis und kann bei Vermietung
und Verkauf in den meisten Fällen verwendet werden. Hier gehts direkt
zum Eingabeformular <br />→ <a
title="Energieausweis online erstellen - Verbrauchsausweis"
href="/energieausweis-erstellen/verbrauchsausweis-erstellen.php"
>Energieausweis online erstellen</a
>
<hr />
</li>
<li>
Der bedarfsbasierte Energieausweis wird als <a
title="Bedarfsausweis"
href="/bedarfsausweis/"><strong>Bedarfsausweis</strong></a
>bezeichnet. Dies ist der „große“ Energieausweis und kann immer
verwendet werden. Bei Neubau und Modernisierung ist er zwingend
vorgeschrieben. Hier gehts direkt zum Eingabeformular <br />→ <a
title="Energieausweis online erstellen - Bedarfsausweis"
href="/energieausweis-erstellen/bedarfsausweis-erstellen.php"
>Energieausweis online erstellen</a
>
</li>
</ul>
</div>
<hr />
<div class="grid grid-cols-3 gap-4">
<FeatureCard heading="Verbrauchsausweis Wohngebäude" price={45} href="/verbrauchsausweis">
<div class="rpt_feature">Unsere Leistungen:</div>
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
<div class="rpt_feature">Registrierung beim DiBt</div>
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
<div class="rpt_feature">telefonische Beratung</div>
</FeatureCard>
<FeatureCard heading="Bedarfsausweis Wohngebäude" price={75} href="/bedarfsausweis">
<div class="rpt_feature">Unsere Leistungen:</div>
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
<div class="rpt_feature">Registrierung beim DiBt</div>
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
<div class="rpt_feature">telefonische Beratung</div>
</FeatureCard>
<FeatureCard heading="Verbrauchsausweis Gewerbe" price={65} href="/verbrauchsausweis-gewerbe">
<div class="rpt_feature">Unsere Leistungen:</div>
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
<div class="rpt_feature">Registrierung beim DiBt</div>
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
<div class="rpt_feature">telefonische Beratung</div>
</FeatureCard>
</div>
<hr />
<h2>Unterschied: Verbrauchsausweis und Bedarfsausweis</h2> Grundsätzlich unterscheidet
man beim Energieausweis zwischen Verbrauchsausweis und Bedarfsausweis.<h3>
Was ist ein Verbrauchsausweis?
</h3>
Der Verbrauchsausweis gibt den Energieverbrauch der Gebäudebewohner in den vergangenen
drei Jahren für Heizung und Warmwasserbereitung an. Um den <a
href="/enev-zusammenfassung#§-19-EnEV"
>Energieverbrauchskennwert zu ermitteln</a
>, wird der tatsächliche Energieverbrauch mithilfe eines standortbezogenen
Klimafaktors bereinigt. Der Durchschnittswert wird dann durch die sogenannte
energetische Gebäudenutzfläche (An) geteilt. So führt beispielsweise ein
hoher Verbrauch in einem einzelnen harten Winter nicht zu einer schlechteren
Beurteilung des Gebäudes. Der tatsächliche Energieverbrauch in einem Gebäude
oder einer Wohnung kann aufgrund des Witterungseinflusses vom
Energieverbrauchskennwert abweichen.Das Ergebnis im Verbrauchsausweis ist
stark vom individuellen Nutzungsverhalten der Bewohner abhängig. Wird in
einem energetisch schlechten Gebäude kaum geheizt, so kann der
Energieausweis trotzdem sehr gut ausfallen.<h3>
Was ist ein Bedarfsausweis?
</h3> Der Bedarfsausweis entsteht auf Grundlage einer technischen <a
href="/enev-zusammenfassung#§-18-EnEV"
>Analyse der Bausubstanz und der Heizungsanlage eines Gebäudes</a
> und ist unabhängig vom individuellen Nutzerverhalten. Die Farbverlaufsskala
im Bedarfsausweis weist zwei verschiedene Werte aus, die sehr unterschiedlich
ausfallen können einen Wert für den Endenergiebedarf und einen für den Primärenergiebedarf.
Zusätzlich wird noch ein Kennwert für die energetische Qualität der Gebäudehülle
dargestellt.Der Energiebedarf gibt die nach technischen Regeln berechnete, vom
konkreten Gebäude jährlich benötigte Energiemenge für Heizung, Lüftung und Warmwasserbereitung
an. Dabei werden bei der Berechnung standardisierte Randbedingungen beispielsweise
eine Innentemperatur von 19 Grad im beheizten Bereich des Gebäudes zugrunde
gelegt. Am Endenergiebedarf sollten sich Hausbewohner orientieren, wenn sie ihren
künftigen Energieverbrauch und die Energiekosten abschätzen wollen.Der Primärenergiebedarf
bildet die Gesamtenergieeffizienz eines Gebäudes ab. Er berücksichtigt neben
der Endenergie auch die so genannte „Vorkette“ (Erkundung, Gewinnung, Verteilung,
Umwandlung) der jeweils eingesetzten Energieträger (z.B. Heizöl, Gas, Strom,
erneuerbare Energien).Besonders niedrig fällt der Primärenergiebedarf aus, wenn
erneuerbare Energien (solare Strahlungsenergie, Geothermie, Energie aus Biomasse)
für die Energieversorgung im Gebäude eingesetzt werden. Am Primärenergiebedarf
können Verbraucher erkennen, wie umweltfreundlich ihr Gebäude ist.<h3>
Fazit Verbrauchsausweis / Bedarfsausweis
</h3> Geht es um den tatsächlichen Verbrauch der Energie, der den Aufwand für
Heizung und zentrale Warmwasserbereitung der vergangenen drei Jahre berücksichtigt,
wird der Energieverbrauchskennwert für den Verbrauchsausweis ermittelt. Bei gewerblichen
Objekten wird zusätzlich der Verbrauch für Beleuchtung und Klimatisierung mit
eingerechnet. Anhand der Zeiträume und der Lage des Gebäudes (Postleitzahl) werden
diese Daten ausgewertet und sowohl zeit-, als auch klimabereinigt zur Bewertung
der vorhandenen energetischen Qualität herangezogen.Für das Ausstellen des Bedarfsausweis
wird der rechnerische Energiebedarf unter standardisierten Randbedingungen benötigt.
Daten rund um Bausubstanz, Gebäudehülle und Heizanlage fließen in die Berechnung
mit ein. Bedarfsausweise widerspiegeln die tatsächliche energetische Qualität
eines Gebäudes damit wesentlich besser als die Verbrauchsausweise.
<hr />
<div class="start_infobox" title="Verbrauchsausweis Wohngebäude">
<div class="start_infobox_inside IB_VA_WG">
<img
alt="Energieausweis online erstellen - Verbrauchsausweis"
title="Energieausweis online erstellen - Verbrauchsausweis"
class="start_infobox_img"
src="/images/energieausweis-online-erstellen-verbrauchsausweis.png"
/>
<div class="title">Verbrauchsausweis Wohngebäude</div>
<hr />
<ul>
<li>
3 zusammenhängende Heizenergieverbräuche müssen eingegeben
werden.
</li>
<li>
Wohnfläche, Baujahr Gebäude und Baujahr Heizung müssen
eingegeben werden.
</li>
<li>
<div class="start_infobox_link">
<a
title="Verbrauchsausweis"
href="/verbrauchsausweis/verbrauchsausweis-wohngebaeude.php"
>Verbrauchsausweis</a
>
bei fast allen Gebäuden möglich. (Baujahr &gt; 1977 - Vermietung/Verkauf)
</div>
</li>
</ul>
<div class="start_infobox_button">
<a
title="Verbrauchsausweis erstellen"
href="/energieausweis-erstellen/verbrauchsausweis-erstellen.php"
>Jetzt Verbrauchsausweis erstellen</a
>
</div>
</div>
</div>
<div class="start_infobox BA-WG" title="Bedarfssausweis Wohngebäude">
<div class="start_infobox_inside">
<img
alt="Energieausweis online erstellen - Bedarfsausweis"
title="Energieausweis online erstellen - Bedarfsausweis"
class="start_infobox_img"
src="/images/energieausweis-online-erstellen-verbrauchsausweis.png"
/>
<div class="title">Bedarfsausweis Wohngebäude</div>
<hr />
<ul>
<li>
Die verwendete Heizungsanlage (Standardkessel,
Brennwertkessel, etc.) muß eingegeben werden.
</li>
<li>
Grundrissgeometrie sowie Baujahr Heizung und Gebäude müssen
eingegeben werden.
</li>
<li>
<a
title="Bedarfsausweis"
href="/bedarfsausweis/bedarfsausweis-wohngebaeude.php"
>Bedarfsausweis</a
> bei allen Gebäuden möglich. Die Berechnung ist umfangreicher
und besser vergleichbar.
</li>
</ul>
<div class="start_infobox_button">
<a
title="Bedarfsausweis erstellen"
href="/energieausweis-erstellen/bedarfsausweis-erstellen.php"
>Jetzt Bedarfsausweis erstellen</a
>
</div>
</div>
</div>
<div class="start_infobox VANW_WG" title="Bedarfsausweis Gewerbe">
<div class="start_infobox_inside">
<img
alt="Energieausweis online erstellen - Bedarfsausweis Gewerbe"
title="Energieausweis online erstellen - Bedarfsausweis Gewerbe"
class="start_infobox_img"
src="/images/energieausweis-online-erstellen-verbrauchsausweis-gewerbe.png"
/>
<div class="title">Bedarfsausweis Gewerbe</div>
<hr />
<ul>
<li>
Aktuelle Grundriss- und Ansichtspläne werden für die
Zonierung benötigt.
</li>
<li>
Baubeschreibung (z.B. aus der Baugenehmigung) mit Angabe der
verwendeten Baustoffe und TGA.
</li>
<li>
Angabe vom Baujahr der Heizung, Gebäude und Klimaanlage.
</li>
<li>
<a
title="Bedarfsausweis Gewerbe"
href="/bedarfsausweis/bedarfsausweis-gewerbe.php"
>Bedarfsausweis Gewerbe</a
> bei allen Nichtwohngebäuden möglich (kann immmer verwendet
werden).
</li>
</ul>
<div class="start_infobox_button">
<a
href="/energieausweis-erstellen/bedarfsausweis-gewerbe-anfragen.php"
title="Bedarfsausweis Gewerbe anfragen"
>Jetzt Bedarfsausweis Gewerbe anfragen</a
>
</div>
</div>
</div>
<hr />
<h2>Energieausweis online erstellen</h2> Soll Wohneigentum veräußert oder bauliches
Teileigentum zum Erwerb angeboten werden, muss dem möglichen Käufer oder Leasingnehmer
auf Verlangen unverzüglich ein
<a href="enev-zusammenfassung#§-16a-EnEV">Energieausweis gezeigt werden</a>.
In den meisten Fällen ist hier ein Verbrauchsausweis ausreichend. Auch
Mietern oder Pächtern soll der Energieausweis unmittelbaren Aufschluss über
die energetischen Bedingungen des Gebäudes aufzeigen.Kommt der Anbieter der
offerierten Immobilie diesem Auftrag nach der Energieeinsparverordnung nicht
nach, drohen Bußgelder bis zu 15 000 Euro. Als Ausnahmen gelten Gebäude mit
nicht mehr als 50 m² Fläche sowie Baudenkmäler (<a
href="enev-zusammenfassung#§-16-EnEV">§ 16 Abs. 4 EnEV</a
>).Die Deutsche Energie-Agentur GmbH (<a
href="https://www.dena.de/"
target="blank">dena</a
>) empfiehlt bei Wohngebäuden generell den Bedarfsausweis. Er erlaubt eine
nutzerunabhängige Bewertung des Gebäudes. Zusätzlich können bei der
Erstellung eines Bedarfsausweises die Empfehlungen für Modernisierungen auf
der Basis einer technischen Analyse des Gebäudes ermittelt werden.
<hr />
<h2>Zusammenfassung: Was ist ein Energieausweis?</h2>
<ul id="start_ul_1">
<li>
Der Gesetzgeber hat zwei Arten des Energieausweises bestimmt: Den
Verbrauchsausweis und den Bedarfsausweis.
</li>
<li>
Je nach Gebäudeart, Baujahr, Nutzungsart gilt es verschiedene
Kriterien für den Energieausweis zu beachten.
</li>
<li>
Der Energieausweis ist ein Mittel, das als Starter für
Energiesparmaßnahmen definiert werden kann.
</li>
<li>
Mit Hilfe des Energieausweises kann sich der Marktwert einer
Immobilie erhöhen.
</li>
<li>
Der Energieausweis offenbart bauliche Mängel, die eine
Energieverschwendung mit sich bringen.
</li>
<li>
Im Energieausweis werden Sanierungs- bzw. Modernisierungsvorschläge
dokumentiert.
</li>
<li>
Anhand des Energiepasses lässt sich der energetische Zustand
verschiedener Gebäude miteinander vergleichen.
</li>
</ul>
</Layout>

View File

@@ -1,11 +0,0 @@
---
import { changeLanguage } from "i18next";
import Kaufabschluss from "#components/Kaufabschluss/Kaufabschluss.svelte";
import AusweisLayout from "#layouts/AusweisLayout.astro";
changeLanguage("fr");
---
<AusweisLayout title="Kaufabschluss Verbrauchsausweis - IBCornelsen">
<Kaufabschluss client:load></Kaufabschluss>
</AusweisLayout>

View File

@@ -1,12 +0,0 @@
---
import { changeLanguage } from "i18next";
import Kundendaten from "#components/Ausweis/Kundendaten.svelte";
import AusweisLayout from "#layouts/AusweisLayout.astro";
changeLanguage("fr");
---
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
<Kundendaten client:load></Kundendaten>
</AusweisLayout>

View File

@@ -1,19 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import LoginView from "../../components/LoginView.svelte";
import Layout from "../../layouts/Layout.astro";
changeLanguage("fr");
const token = Astro.cookies.get("token").value;
const expires = Astro.cookies.get("expires").number();
const now = moment().unix();
if (token && now < expires) {
return Astro.redirect(`/user`);
}
---
<Layout title="Login">
<LoginView client:only></LoginView>
</Layout>

View File

@@ -1,9 +0,0 @@
---
import { changeLanguage } from "i18next";
changeLanguage("fr");
Astro.cookies.delete("token");
Astro.cookies.delete("expires");
return Astro.redirect("/");
---

View File

@@ -1,247 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import { Ausweis } from "src/lib/Ausweis";
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
import Checkbox from "#components/Checkbox.svelte";
import PDFHeader from "#components/PDF/PDFHeader.svelte";
import PDFSectionHeader from "#components/PDF/PDFSectionHeader.svelte";
import PDFLayout from "#layouts/PDFLayout.astro";
changeLanguage("fr");
const base64 = Astro.url.searchParams.get("base64");
if (!base64) {
return Astro.redirect("/404");
}
const ausweis = Verbrauchsausweis.fromBase64(base64);
if (!ausweis) {
return Astro.redirect("/404");
}
---
<PDFLayout title="Ansichtsausweis">
<div class="flex flex-col gap-20">
<div class="flex flex-col gap-2">
<PDFHeader></PDFHeader>
<PDFSectionHeader number={1}>
<p class="text-xs">
Gültig bis: <span
>{
moment().add("10", "years").locale("de").format("DD. MMM. YYYY")
}</span>
</p>
<p class="text-xs">Ausweis ID <span>1293819</span></p>
<p class="text-xs">
Registriernummer wird nach Zahlungseingang vergeben
</p>
</PDFSectionHeader>
<div
class="border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg"
>
<h2>Gebäude</h2>
<div class="flex flex-col">
<div class="flex flex-row">
<table>
<tr>
<td>Gebäudetyp</td>
<td>{ausweis.objekt_typ}</td>
</tr>
<tr>
<td>Adresse</td>
<td>{ausweis.objekt_strasse}</td>
</tr>
<tr>
<td>Gebäudeteil</td>
<td>{ausweis.objekt_gebaeudeteil}</td>
</tr>
<tr>
<td>Baujahr Gebäude ³</td>
<td>{ausweis.baujahr_gebaeude}</td>
</tr>
<tr>
<td
>Baujahr Wärmeerzeuger <sup>3</sup>
<sup>4</sup></td
>
<td>{ausweis.baujahr_anlage}</td>
</tr>
<tr>
<td>Anzahl Wohnungen</td>
<td>{ausweis.anzahl_einheiten}</td>
</tr>
<tr>
<td>Gebäudenutzfläche (A<sub>N</sub>)</td>
<td>
<table>
<tr>
<td>192m²</td>
<td
class="flex flex-row items-center h-full w-full gap-2 pl-2"
>
<input type="checkbox" />
nach § 19 EnEV aus der Wohnfläche ermittelt
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td
>Wesentliche Energieträger für<br /> Heizung und
Warmwasser <sup>3</sup></td
>
<td>Erdgas, BraunkohleBraunkohle, Strommix</td>
</tr>
</table>
<div class="w-[35%]">
<img src="" alt="" />
</div>
</div>
<div>
<table></table>
</div>
</div>
</div>
<div class="box">
<h2>
Hinweise zu den Angaben über die energetische Qualität des
Gebäudes
</h2>
<div class="bg-white w-full">
<p>
Die energetische Qualität eines Gebäudes kann durch die
Berechnung des <strong>Energiebedarfs</strong> unter Annahme
von standardisierten Randbedingungen oder durch die Auswertung
des <strong>Energieverbrauchs</strong> ermittelt werden. Als
Bezugsfläche dient die energetische Gebäudenutzfläche nach der
EnEV, die sich in der Regel von den allgemeinen Wohnflächenangaben
unterscheidet. Die angegebenen Vergleichswerte sollen überschlägige
Vergleiche ermöglichen (<strong
>Erläuterungen - siehe Seite 5</strong
>). Teil des Energieausweises sind die
Modernisierungsempfehlungen (Seite 4).
</p>
<Checkbox checked={true}>
Der Energieausweis wurde auf der Grundlage von Berechnungen
des <strong>Energiebedarfs</strong> erstellt (Energiebedarfsausweis).
Die Ergebnisse sind auf <strong>Seite 2</strong> dargestellt.
Zusätzliche Informationen zum Verbrauch sind freiwillig.
</Checkbox>
<Checkbox checked={false}>
Der Energieausweis wurde auf der Grundlage von Auswertungen
des <strong>Energieverbrauchs</strong> erstellt (Energieverbrauchsausweis).
Die Ergebnisse sind auf <strong>Seite 3</strong> dargestellt.
</Checkbox>
<div class="flex flex-row justify-between items-center w-[80%]">
<p>Datenerhebung Bedarf/Verbrauch durch</p>
<Checkbox checked={true}>Eigentümer</Checkbox>
<Checkbox checked={false}>Aussteller</Checkbox>
</div>
<Checkbox>
Dem Energieausweis sind zusätzliche Informationen zur
energetischen Qualität beigefügt (freiwillige Angabe).
</Checkbox>
</div>
</div>
<div class="box">
<h2>Hinweise zur Verwendung des Energieausweises</h2>
<p class="bg-white">
Der Energieausweis dient lediglich der Information. Die Angaben
im Energieausweis beziehen sich auf das gesamte Wohngebäude oder
den oben bezeichneten Gebäudeteil. Der Energieausweis ist
lediglich dafür gedacht, einen überschlägigen Vergleich von
Gebäuden zu ermöglichen.
</p>
</div>
<div class="flex flex-row gap-2">
<div class="bg-pdf-yellow-light rounded-lg p-2 w-full h-20">
<p>Aussteller:</p>
</div>
<div class="bg-pdf-yellow-light rounded-lg p-2 w-full h-20"></div>
</div>
<div class="flex flex-row flex-wrap">
<p>
<sup>1</sup> Datum der angewendeten EnEV, gegebenenfalls angewendeten
Änderungsverordnung zur EnEV
</p>
<p>
<sup>2</sup> Bei nicht rechtzeitiger Zuteilung der Registriernummer
(§ 17 Absatz 4 Satz 4 und 5 EnEV) ist das Datum der Antragstellung
einzutragen; die Registriernummer ist nach deren Eingang nachträglich
einzusetzen.
</p>
<p><sup>3</sup> Mehrfachangaben möglich</p>
<p><sup>4</sup> bei Wärmenetzen Baujahr der Übergabestation</p>
</div>
</div>
<div class="flex flex-col gap-2">
<PDFHeader></PDFHeader>
<PDFSectionHeader number={2}>
<p>Berechneter Energiebedarf des Gebäudes</p>
</PDFSectionHeader>
<div
class="box"
>
<h2>Energiebedarf</h2>
<div class="bg-white w-full flex flex-col">
<div class="flex flex-col items-end text-center">
<div class="flex flex-row">
<span class="bg-gray-300 p-0.5">200</span>
<span>kg/(m²a)</span>
</div>
<span>CO² Treibhausgas Emissionen</span>
</div>
</div>
</div>
</div>
</div>
</PDFLayout>
<style is:global>
table {
@apply w-full h-full;
}
td > table td {
@apply px-0 py-0 border-t-0 border-b-0;
}
td:has(table) {
@apply p-0;
}
td > table td:first-child {
@apply border-l-0;
}
td > table td:last-child {
@apply border-r-0;
}
td {
@apply border border-black px-1 text-xs py-0.5;
}
td:not(:first-child) {
@apply bg-white;
}
h2 {
@apply font-bold text-sm;
}
p,
label {
@apply text-xs;
}
.box {
@apply border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg;
}
.box > * {
@apply px-1 py-0.5;
}
</style>

View File

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

View File

@@ -1,19 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import RegisterView from "../../components/RegisterView.svelte";
import Layout from "../../layouts/Layout.astro";
changeLanguage("fr");
const token = Astro.cookies.get("token").value;
const expires = Astro.cookies.get("expires").number();
const now = moment().unix();
if (token && now < expires) {
return Astro.redirect("/user");
}
---
<Layout title="Login">
<RegisterView client:only></RegisterView>
</Layout>

View File

@@ -1,38 +0,0 @@
---
import { changeLanguage } from "i18next";
import moment from "moment";
import { decodeToken } from "#lib/JsonWebToken";
import { User } from "#lib/User";
import UserLayout from "#layouts/UserLayout.astro";
import AusweisCard from "#components/AusweisCard.svelte";
import { Verbrauchsausweis } from "#lib/Ausweis/Verbrauchsausweis";
changeLanguage("fr");
const token = Astro.cookies.get("token").value;
const expires = Astro.cookies.get("expires").number();
const now = moment().unix();
if (!token || now > expires) {
Astro.cookies.delete("token");
Astro.cookies.delete("expires");
return Astro.redirect(`/login`);
}
const parsed = decodeToken(token);
const user = await User.fromUID(parsed.uid);
if (!user) {
Astro.cookies.delete("token");
Astro.cookies.delete("expires");
return Astro.redirect(`/login`);
}
---
<UserLayout title="Dashboard">
<h1>Willkommen zurück <b>{user.email}</b></h1>
<h2>Ihre Ausweise</h2>
<div class="grid grid-flow-row grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
<AusweisCard client:load hidden={true} i={0} ausweis={new Verbrauchsausweis()}></AusweisCard>
<AusweisCard client:load hidden={true} i={1} ausweis={new Verbrauchsausweis()}></AusweisCard>
<AusweisCard client:load hidden={true} i={2} ausweis={new Verbrauchsausweis()}></AusweisCard>
</div>
</UserLayout>

View File

@@ -1,11 +0,0 @@
---
import { changeLanguage } from "i18next";
import AusweisLayout from "#layouts/AusweisLayout.astro";
import VerbrauchsausweisGewerbeContent from "#components/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeContent.svelte";
changeLanguage("fr");
---
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen">
<VerbrauchsausweisGewerbeContent client:load></VerbrauchsausweisGewerbeContent>
</AusweisLayout>

View File

@@ -1,8 +0,0 @@
---
import { changeLanguage } from "i18next";
changeLanguage("fr");
console.log(Object.fromEntries(new URLSearchParams(await Astro.request.text())));
return Astro.redirect("/kundendaten");
---

View File

@@ -1,13 +0,0 @@
---
import { changeLanguage } from "i18next";
import AusweisLayout from "#layouts/AusweisLayout.astro";
import VerbrauchsausweisContent from "#components/Verbrauchsausweis/VerbrauchsausweisContent.svelte";
changeLanguage("fr");
const uid = Astro.cookies.get("ausweis_uid").value;
---
<AusweisLayout title="Verbrauchsausweis erstellen">
<VerbrauchsausweisContent client:load uid={uid} />
</AusweisLayout>

View File

@@ -1,11 +1,8 @@
--- ---
import { changeLanguage } from "i18next";
import moment from "moment"; import moment from "moment";
import LoginView from "../components/LoginView.svelte"; import LoginModule from "../modules/LoginModule.svelte";
import Layout from "../layouts/Layout.astro"; import Layout from "../layouts/Layout.astro";
changeLanguage("de");
const token = Astro.cookies.get("token").value; const token = Astro.cookies.get("token").value;
const expires = Astro.cookies.get("expires").number(); const expires = Astro.cookies.get("expires").number();
const now = moment().unix(); const now = moment().unix();
@@ -15,5 +12,5 @@ if (token && now < expires) {
--- ---
<Layout title="Login"> <Layout title="Login">
<LoginView client:only></LoginView> <LoginModule client:only></LoginModule>
</Layout> </Layout>

View File

@@ -1,7 +1,7 @@
--- ---
import { changeLanguage } from "i18next"; import { changeLanguage } from "i18next";
import moment from "moment"; import moment from "moment";
import RegisterView from "../components/RegisterView.svelte"; import RegisterView from "../modules/RegisterModule.svelte";
import Layout from "../layouts/Layout.astro"; import Layout from "../layouts/Layout.astro";
changeLanguage("de"); changeLanguage("de");
@@ -14,6 +14,6 @@ if (token && now < expires) {
} }
--- ---
<Layout title="Login"> <Layout title="Registrieren - IBCornelsen">
<RegisterView client:only></RegisterView> <RegisterView client:only></RegisterView>
</Layout> </Layout>

View File

@@ -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 VerbrauchsausweisContent from "#components/Verbrauchsausweis/VerbrauchsausweisContent.svelte"; import Verbrauchsausweis from "#modules/Ausweise/Verbrauchsausweis.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">
<VerbrauchsausweisContent client:load uid={uid} /> <Verbrauchsausweis client:load uid={uid} />
</AusweisLayout> </AusweisLayout>

View File

@@ -23,7 +23,8 @@
"paths": { "paths": {
"#lib/*": ["./src/lib/*"], "#lib/*": ["./src/lib/*"],
"#components/*": ["./src/components/*"], "#components/*": ["./src/components/*"],
"#layouts/*": ["./src/layouts/*"] "#layouts/*": ["./src/layouts/*"],
"#modules/*": ["./src/modules/*"],
} }
} }
} }