Verbrauchsausweis Gewerbe

This commit is contained in:
Moritz Utcke
2025-02-05 11:18:42 +07:00
parent 5fc1dd8f80
commit 7add66ab78
20 changed files with 339 additions and 210 deletions

View File

@@ -5,13 +5,13 @@ export const createCaller = createCallerFactory({
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"objekt": await import("../src/pages/api/objekt/index.ts"),
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
"objekt": await import("../src/pages/api/objekt/index.ts"),
"ticket": await import("../src/pages/api/ticket/index.ts"),
"user": await import("../src/pages/api/user/index.ts"),
"user/self": await import("../src/pages/api/user/self.ts"),

View File

@@ -9,13 +9,15 @@
} from "@ibcornelsen/database/client";
import {
BedarfsausweisWohnenClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
export let ausweis: VerbrauchsausweisWohnenClient;
export let gebaeude: ObjektClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let objekt: ObjektClient;
export let images: UploadedGebaeudeBild[] = [];
</script>
@@ -29,7 +31,7 @@
kategorie={Enums.BilderKategorie.Gebaeude}
max={1}
min={1}
bind:gebaeude
bind:objekt
bind:images
bind:ausweis
>

View File

@@ -3,13 +3,15 @@
import Hilfe from "#components/Ausweis/Hilfe.svelte";
import {
AufnahmeClient,
BedarfsausweisWohnenClient,
BenutzerClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
export let ausweis: VerbrauchsausweisWohnenClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let bilder: UploadedGebaeudeBild[];
export let user: BenutzerClient;
export let objekt: ObjektClient;

View File

@@ -1,11 +1,11 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
import { Enums } from "@ibcornelsen/database/client";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let gebaeude: ObjektClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let objekt: ObjektClient;
</script>
<div class="grid grid-cols-2 gap-x-6 mt-6">
@@ -66,7 +66,7 @@
kategorie={Enums.BilderKategorie.Daemmung}
bind:images
bind:ausweis
bind:gebaeude
bind:objekt
>
TEXT FEHLT
</ImageGrid>

View File

@@ -1,11 +1,11 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
import { Enums } from "@ibcornelsen/database/client";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let gebaeude: ObjektClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let objekt: ObjektClient;
</script>
<div class="grid grid-cols-2 gap-x-6 mt-6">
@@ -62,7 +62,7 @@
kategorie={Enums.BilderKategorie.Fenster}
bind:images
bind:ausweis
bind:gebaeude
bind:objekt
>
TEXT FEHLT
</ImageGrid>

View File

@@ -1,10 +1,10 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { Enums, type BedarfsausweisWohnen, type VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./types.js";
import { Enums } from "@ibcornelsen/database/client";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude: ObjektClient;
</script>
@@ -57,7 +57,7 @@
kategorie={Enums.BilderKategorie.Heizung}
max={4}
min={1}
bind:gebaeude
bind:objekt={gebaeude}
bind:images
bind:ausweis
>

View File

@@ -10,7 +10,7 @@
} from "./types.js";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
export let ausweis: VerbrauchsausweisWohnenClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient;

View File

@@ -1,28 +1,30 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import FensterImage from "./FensterImage.svelte";
import FensterImage from "./FensterImage.svelte";
//import Label from "../Label.svelte";
//import Label from "../Label.svelte";
import {
AufnahmeClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import { boolean } from "astro:schema";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
import {
AufnahmeClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import { boolean } from "astro:schema";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
export let gebaeude: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient
export let images: UploadedGebaeudeBild[];
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
export let images: UploadedGebaeudeBild[];
</script>
</script>
<div
id="sanierungszustand"
class="bereich-box grid
grid-cols-1 gap-x-4 gap-y-2
sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
@@ -30,25 +32,74 @@
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
"
>
<SanierungsOption
label="Einfachglas"
name="einfach_verglasung"
help=""
value="EG"
bind:checked={aufnahme.einfach_verglasung}
></SanierungsOption>
<SanierungsOption
label="Doppelverglasung"
name="doppel_verglasung"
help=""
value="DF"
bind:checked={aufnahme.doppel_verglasung}
></SanierungsOption>
<SanierungsOption
label="Dreifachverglasung"
name="dreifach_verglasung"
help=""
value="PHF"
bind:checked={aufnahme.dreifach_verglasung}
></SanierungsOption>
<SanierungsOption
label="Isolierverglasung"
name="isolier_verglasung"
help=""
value="IVG"
bind:checked={aufnahme.isolier_verglasung}
></SanierungsOption>
<SanierungsOption
label="Alle Fenster dicht"
name="fenster_dicht"
help=""
value="FD"
bind:checked={aufnahme.fenster_dicht}
></SanierungsOption>
<SanierungsOption
label="Fenster teilweise undicht"
name="fenster_teilweise_undicht"
help=""
value="FTUD"
bind:checked={aufnahme.fenster_teilweise_undicht}
></SanierungsOption>
<SanierungsOption
label="Rollladenkästen gedämmt, luftdicht"
name="rolllaeden_kaesten_gedaemmt"
help=""
value="TUD"
bind:checked={aufnahme.rolllaeden_kaesten_gedaemmt}
></SanierungsOption>
<SanierungsOption
label="Alle Türen dicht"
name="tueren_dicht"
help=""
value="TD"
bind:checked={aufnahme.tueren_dicht}
></SanierungsOption>
<SanierungsOption
label="Türen teilweise undicht"
name="tueren_undicht"
help=""
value="TUD"
bind:checked={aufnahme.tueren_undicht}
></SanierungsOption>
</div>
<SanierungsOption label="Einfachglas" name="einfach_verglasung" help="" value="EG" bind:checked={aufnahme.einfach_verglasung}></SanierungsOption>
<SanierungsOption label="Doppelverglasung" name="doppel_verglasung" help="" value="DF" bind:checked={aufnahme.doppel_verglasung}></SanierungsOption>
<SanierungsOption label="Dreifachverglasung" name="dreifach_verglasung" help="" value="PHF" bind:checked={aufnahme.dreifach_verglasung}></SanierungsOption>
<SanierungsOption label="Isolierverglasung" name="isolier_verglasung" help="" value="IVG" bind:checked={aufnahme.isolier_verglasung}></SanierungsOption>
<SanierungsOption label="Alle Fenster dicht" name="fenster_dicht" help="" value="FD" bind:checked={aufnahme.fenster_dicht}></SanierungsOption>
<SanierungsOption label="Fenster teilweise undicht" name="fenster_teilweise_undicht" help="" value="FTUD" bind:checked={aufnahme.fenster_teilweise_undicht}></SanierungsOption>
<SanierungsOption label="Rollladenkästen gedämmt, luftdicht" name="rolllaeden_kaesten_gedaemmt" help="" value="TUD" bind:checked={aufnahme.rolllaeden_kaesten_gedaemmt}></SanierungsOption>
<SanierungsOption label="Alle Türen dicht" name="tueren_dicht" help="" value="TD" bind:checked={aufnahme.tueren_dicht}></SanierungsOption>
<SanierungsOption label="Türen teilweise undicht" name="tueren_undicht" help="" value="TUD" bind:checked={aufnahme.tueren_undicht}></SanierungsOption>
</div>
<FensterImage bind:images bind:ausweis bind:gebaeude />
<style lang="postcss">
<FensterImage bind:images bind:ausweis bind:objekt />
<!--
Wir benötigen diese Angaben um den allgemeinen Modernisierungsstand
@@ -162,4 +213,5 @@
-->
<style lang="postcss">
</style>

View File

@@ -10,14 +10,15 @@
AufnahmeClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import { boolean } from "astro:schema";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
export let gebaeude: ObjektClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
export let images: UploadedGebaeudeBild[];
</script>
@@ -119,7 +120,7 @@
></SanierungsOption>
</div>
<HeizungImage bind:images bind:ausweis bind:gebaeude />
<HeizungImage bind:images bind:ausweis bind:gebaeude={objekt} />
<!--

View File

@@ -1,29 +1,30 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import DaemmungImage from "./DaemmungImage.svelte";
import DaemmungImage from "./DaemmungImage.svelte";
//import Label from "../Label.svelte";
import {
AufnahmeClient,
BedarfsausweisWohnenClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
//import Label from "../Label.svelte";
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnenClient;
export let images: UploadedGebaeudeBild[];
</script>
import {
AufnahmeClient,
ObjektClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import { boolean } from "astro:schema";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"
export let gebaeude: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient
export let images: UploadedGebaeudeBild[];
</script>
<div
id="sanierungszustand"
class="bereich-box grid
grid-cols-1 gap-x-4 gap-y-2
sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
@@ -31,21 +32,53 @@
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
"
>
<SanierungsOption
label="Außenwand gedämmt"
name="aussenwand_gedaemmt"
help=""
value="AWD"
bind:checked={aufnahme.aussenwand_gedaemmt}
></SanierungsOption>
<SanierungsOption
label="Kelleraußenwand gedämmt"
name="keller_wand_gedaemmt"
help=""
value="KWD"
bind:checked={aufnahme.keller_wand_gedaemmt}
></SanierungsOption>
<SanierungsOption
label="Kellerdecke gedämmt"
name="keller_decke_gedaemmt"
help=""
value="KDD"
bind:checked={aufnahme.keller_decke_gedaemmt}
></SanierungsOption>
<SanierungsOption
label="Dachgeschoss gedämmt"
name="dachgeschoss_gedaemmt"
help=""
value="DGD"
bind:checked={aufnahme.dachgeschoss_gedaemmt}
></SanierungsOption>
<SanierungsOption
label="Oberste Geschossdecke gedämmt"
name="oberste_geschossdecke_gedaemmt"
help=""
value="DGD"
bind:checked={aufnahme.oberste_geschossdecke_gedaemmt}
></SanierungsOption>
<SanierungsOption
label="Oberste Geschossdecke min. 12cm gedämmt"
name="oberste_geschossdecke_min_12cm_gedaemmt"
help=""
value="DGD"
bind:checked={aufnahme.oberste_geschossdecke_min_12cm_gedaemmt}
></SanierungsOption>
</div>
<SanierungsOption label="Außenwand gedämmt" name="aussenwand_gedaemmt" help="" value="AWD" bind:checked={aufnahme.aussenwand_gedaemmt}></SanierungsOption>
<SanierungsOption label="Kelleraußenwand gedämmt" name="keller_wand_gedaemmt" help="" value="KWD" bind:checked={aufnahme.keller_wand_gedaemmt}></SanierungsOption>
<SanierungsOption label="Kellerdecke gedämmt" name="keller_decke_gedaemmt" help="" value="KDD" bind:checked={aufnahme.keller_decke_gedaemmt}></SanierungsOption>
<SanierungsOption label="Dachgeschoss gedämmt" name="dachgeschoss_gedaemmt" help="" value="DGD" bind:checked={aufnahme.dachgeschoss_gedaemmt}></SanierungsOption>
<SanierungsOption label="Oberste Geschossdecke gedämmt" name="oberste_geschossdecke_gedaemmt" help="" value="DGD" bind:checked={aufnahme.oberste_geschossdecke_gedaemmt}></SanierungsOption>
<SanierungsOption label="Oberste Geschossdecke min. 12cm gedämmt" name="oberste_geschossdecke_min_12cm_gedaemmt" help="" value="DGD" bind:checked={aufnahme.oberste_geschossdecke_min_12cm_gedaemmt}></SanierungsOption>
</div>
<DaemmungImage bind:images bind:ausweis bind:gebaeude />
<style lang="postcss">
<DaemmungImage bind:images bind:ausweis bind:objekt />
<!--
<div class="GRB3">
<div class="form-group col-md-12">
@@ -72,4 +105,5 @@
-->
<style lang="postcss">
</style>

View File

@@ -16,13 +16,13 @@
import {
AufnahmeClient,
ObjektClient,
VerbrauchsausweisWohnenClient,
VerbrauchsausweisGewerbeClient,
} from "./types.js";
import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: ObjektClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient;
export let ausweis: VerbrauchsausweisGewerbeClient;
// Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl.
// Allerdings müssen wir auch berücksichtigen, dass wir drei folgende Jahre brauchen, also
@@ -48,12 +48,12 @@
];
const startDate = moment(
ausweis.aufnahme.erstellungsdatum || Date.now()
aufnahme.erstellungsdatum || Date.now()
)
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment(
ausweis.aufnahme.erstellungsdatum || Date.now()
aufnahme.erstellungsdatum || Date.now()
).subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
@@ -102,7 +102,7 @@
}
}
$: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude);
$: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
</script>
<div
@@ -655,11 +655,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<!-- Enthält Stromverbrauch für: -->
<SanierungsOption label="Heizung" name="stromverbrauch_enthaelt_heizung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_heizung}></SanierungsOption>
<SanierungsOption label="Warmwasser " name="stromverbrauch_enthaelt_warmwasser" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_warmwasser}></SanierungsOption>
<SanierungsOption label="Lüftung " name="stromverbrauch_enthaelt_lueftung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_lueftung}></SanierungsOption>
<SanierungsOption label="Beleuchtung" name="stromverbrauch_enthaelt_beleuchtung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_beleuchtung}></SanierungsOption>
<SanierungsOption label="Kühlung" name="stromverbrauch_enthaelt_kuehlung" help="" bind:checked={aufnahme.stromverbrauch_enthaelt_kuehlung}></SanierungsOption>
<SanierungsOption label="Heizung" name="stromverbrauch_enthaelt_heizung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_heizung}></SanierungsOption>
<SanierungsOption label="Warmwasser " name="stromverbrauch_enthaelt_warmwasser" help="" bind:checked={ausweis.stromverbrauch_enthaelt_warmwasser}></SanierungsOption>
<SanierungsOption label="Lüftung " name="stromverbrauch_enthaelt_lueftung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_lueftung}></SanierungsOption>
<SanierungsOption label="Beleuchtung" name="stromverbrauch_enthaelt_beleuchtung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_beleuchtung}></SanierungsOption>
<SanierungsOption label="Kühlung" name="stromverbrauch_enthaelt_kuehlung" help="" bind:checked={ausweis.stromverbrauch_enthaelt_kuehlung}></SanierungsOption>
<div class="input-standard">
<Inputlabel title="Sonstige"></Inputlabel>

View File

@@ -1,15 +1,15 @@
<script lang="ts">
import UploadImages from "./UploadImages.svelte";
import type { BedarfsausweisWohnen, Enums, VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import type { Enums } from "@ibcornelsen/database/client";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons";
export let images: UploadedGebaeudeBild[] = [];
export let max: number = 4;
export let min: number = 1;
export let name: string = "";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let gebaeude: ObjektClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let objekt: ObjektClient;
export let kategorie: Enums.BilderKategorie
async function rotateImage(image: UploadedGebaeudeBild): Promise<UploadedGebaeudeBild> {
@@ -36,7 +36,7 @@
</script>
<div class="flex flex-col gap-4">
<UploadImages {name} {kategorie} {max} {min} bind:upload bind:gebaeude bind:images bind:ausweis><slot /></UploadImages>
<UploadImages {name} {kategorie} {max} {min} bind:upload bind:objekt bind:images bind:ausweis><slot /></UploadImages>
<div class="grid grid-cols-2 gap-2">
{#each images as image, i}
{#if image.kategorie == kategorie}

View File

@@ -1,17 +1,17 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import type { BedarfsausweisWohnen, Enums, VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
import type { Enums } from "@ibcornelsen/database/client";
export let max: number = 2;
export let min: number = 1;
export let name: string = ""
// Array of base64 encoded images read into the input.
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let gebaeude: ObjektClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let objekt: ObjektClient;
export let kategorie: Enums.BilderKategorie;
function getAllImages(this: HTMLInputElement) {
@@ -36,7 +36,7 @@
const reader = new FileReader();
reader.onload = (ev) => {
reader.onload = () => {
if (reader.readyState != reader.DONE) {
return;
}

View File

@@ -1,8 +1,8 @@
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js";
export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient, gebaeude: AufnahmeClient): number[] {
if (gebaeude.leerstand && (gebaeude.leerstand > 0)) {
export function auditVerbrauchAbweichung(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient): number[] {
if (aufnahme.leerstand && (aufnahme.leerstand > 0)) {
return [];
}

View File

@@ -1,9 +1,12 @@
import fuelList from "#components/Ausweis/brennstoffListe";
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { Enums } from "@ibcornelsen/database/client";
import { type Enums } from "@ibcornelsen/database/client";
import "cypress-file-upload"
describe("Verbrauchsausweis erstellen Schritt 1", () => {
const ausstellgrund = (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]);
const heizungsstatus = (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]);
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
cy.visit("/energieausweis-erstellen/verbrauchsausweis-gewerbe");
@@ -11,11 +14,11 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("input[name='ausstellgrund']")
.should("have.length", Object.values(Enums.Ausstellgrund).length)
.should("have.length", ausstellgrund.length)
.eq(
faker.number.int({
min: 0,
max: Object.values(Enums.Ausstellgrund).length - 1,
max: ausstellgrund.length - 1,
})
)
.check();
@@ -71,14 +74,14 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", heizungsstatus.length).parent().select(faker.number.int({
max: heizungsstatus.length,
min: 1
}));
// Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", heizungsstatus.length).parent().select(faker.number.int({
max: heizungsstatus.length,
min: 1
}));

View File

@@ -1,13 +1,12 @@
<script lang="ts">
import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte";
import ProgressBar from "#components/Ausweis/Progressbar.svelte";
import Hilfe from "#components/Ausweis/Hilfe.svelte";
import { PRICES } from "#lib/constants";
import { PRICES } from "#lib/constants.js";
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
import objektDaten from "#components/Ausweis/GebaeudeDaten.svelte";
import Warmwasseranteil from "#components/Ausweis/Warmwasseranteil.svelte";
import ThermischeKuehlung from "#components/Ausweis/ThermischeKuehlung.svelte";
import LueftungundLeerstand from "#components/Ausweis/LueftungundLeerstand.svelte";
@@ -17,37 +16,26 @@
import AusweisPreviewContainer from "#components/Ausweis/AusweisPreviewContainer.svelte";
import Bereich from "#components/labels/Bereich.svelte";
import HelpLabel from "#components/HelpLabel.svelte";
import Verbrauch from "#components/Ausweis/Verbrauch.svelte";
import StromVerbrauch from "#components/Ausweis/StromVerbrauch.svelte";
import Label from "#components/Label.svelte";
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import ZipSearch from "../../components/PlzSuche.svelte";
import { buildingTypes } from "./BuildingTypes.js";
import BilderZusatzsysteme from "../../components/Ausweis/BilderZusatzsysteme.svelte";
import moment from "moment";
import { Enums } from "@ibcornelsen/database/client";
import { ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
import { BenutzerClient } from "#components/Ausweis/types.js";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
export let ausweis: VerbrauchsausweisGewerbeClient;
export let user: BenutzerClient = {} as BenutzerClient;
export let objekt: ObjektClient = {} as ObjektClient;
export let aufnahme: AufnahmeClient = {} as AufnahmeClient;
export let bilder: UploadedGebaeudeBild[] = [];
export let ausweisart = "Verbrauchsausweis Gewerbe";
export let Energieausweis = "Verbrauchsausweis Gewerbe";
let aufnahme = ausweis.aufnahme || {};
let gebaeude = ausweis.aufnahme?.objekt || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.aufnahme?.objekt?.gebaeude_bilder || [];
function automatischAusfüllen() {
}
function automatischAusfüllen() {}
async function spaeterWeitermachen() {
const result = await verbrauchsausweisWohnenSpeichern(
ausweis,
gebaeude,
objekt,
aufnahme,
images,
bilder,
user
);
@@ -55,8 +43,8 @@
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid;
gebaeude.uid = result.gebaeude_uid;
aufnahme.uid = result.gebaeude_aufnahme_uid;
objekt.uid = result.objekt_uid;
aufnahme.uid = result.objekt_aufnahme_uid;
window.history.pushState(
{},
"",
@@ -77,14 +65,14 @@
<PerformanceScore
bind:ausweis
bind:aufnahme={aufnahme}
bind:objekt={gebaeude}
bind:objekt={objekt}
/>
</div>
<div id="progress-box" class="w-full box relative px-4 py-3 text-center order-1 2xl:order-2 self-stretch">
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
<h2 class="text-primary text-xl">{Energieausweis} {PRICES.VerbrauchsausweisGewerbe[0]}</h2>
<h2 class="text-primary text-xl">{ausweisart} {PRICES.VerbrauchsausweisGewerbe[0]}</h2>
<ProgressBar progress={0} />
</div>
@@ -103,10 +91,10 @@
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart
bind:gebaeude
bind:objekt
bind:aufnahme
bind:ausweis
ausweisart={Energieausweis}
ausweisart={ausweisart}
/>
</Bereich>
@@ -117,7 +105,8 @@
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
>
<GebaeudeDaten
bind:aufnahme />
bind:aufnahme
bind:objekt />
</Bereich
>
@@ -128,7 +117,7 @@
title="Eingabe von 3 zusammenhängenden Verbrauchsjahren"
>
<StromVerbrauch
bind:gebaeude
bind:objekt
bind:aufnahme
bind:ausweis
/>
@@ -158,8 +147,8 @@
<Bereich bereich="F" title="Angaben zur Heizunganlage"
><SanierungszustandHeizungsanlage
bind:images
bind:gebaeude
bind:images={bilder}
bind:objekt
bind:aufnahme
bind:ausweis
/></Bereich
@@ -169,8 +158,8 @@
<Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
><SanierungszustandFensterTueren
bind:images
bind:gebaeude
bind:images={bilder}
bind:objekt
bind:aufnahme
bind:ausweis
/></Bereich
@@ -179,8 +168,8 @@
<Bereich bereich="H" title="Angaben zur Wärmedämmung"
><SanierungszustandWaermedammung
bind:images
bind:gebaeude
bind:images={bilder}
bind:objekt
bind:aufnahme
bind:ausweis
/></Bereich
@@ -190,18 +179,18 @@
<Bereich bereich="I" title="Gebäudebild und Energieausweis PDF Vorschau"
><AusweisPreviewContainer
bind:images
bind:images={bilder}
bind:ausweis
bind:gebaeude
bind:objekt
/></Bereich>
</div>
<ButtonWeiterHilfe {spaeterWeitermachen}
bind:ausweis
bind:images
bind:bilder
bind:user
bind:gebaeude
bind:objekt
bind:aufnahme
>
</ButtonWeiterHilfe>

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import { validateAccessTokenClient } from "#client/lib/validateAccessToken.js";
import { verbrauchsausweisWohnenSpeichern } from "#client/lib/verbrauchsausweisWohnenSpeichern.js";
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { addNotification } from "#components/Notifications/index.js";
import Overlay from "#components/Overlay.svelte";
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
@@ -10,7 +10,7 @@
export let objekt: ObjektClient;
export let bilder: UploadedGebaeudeBild[];
export let ausweis: VerbrauchsausweisWohnenClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let user: BenutzerClient;
export let aufnahme: AufnahmeClient;

View File

@@ -256,7 +256,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
<Bereich bereich="F" title="Angaben zur Heizunganlage"
><SanierungszustandHeizungsanlage
bind:images={bilder}
bind:gebaeude={objekt}
bind:objekt={objekt}
bind:aufnahme={aufnahme}
bind:ausweis
/></Bereich
@@ -267,7 +267,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
<Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
><SanierungszustandFensterTueren
bind:images={bilder}
bind:gebaeude={objekt}
bind:objekt={objekt}
bind:aufnahme={aufnahme}
bind:ausweis
/></Bereich
@@ -277,7 +277,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
<Bereich bereich="H" title="Angaben zur Wärmedämmung"
><SanierungszustandWaermedammung
bind:images={bilder}
bind:gebaeude={objekt}
bind:objekt={objekt}
bind:aufnahme={aufnahme}
bind:ausweis
/></Bereich
@@ -289,7 +289,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen"
><AusweisPreviewContainer
bind:images={bilder}
bind:ausweis
bind:gebaeude={objekt}
bind:objekt={objekt}
/></Bereich
>
</div>

View File

@@ -4,16 +4,12 @@ import { prisma, VerbrauchsausweisGewerbeSchema } from "@ibcornelsen/database/se
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const PATCH = defineApiRoute({
fetch(input, context) {},
});
export const PUT = defineApiRoute({
meta: {
contentTypes: ["application/json"],
description:
"Erstellt einen neuen Verbrauchsausweis für Gewerbegebäude nach dem Schema der EnEV von 2016. Als Input wird ein bestehendes Gebäude benötigt. Falls keine UID einer bestehenden Gebäudeaufnahme mitgegeben wird, wird automatisch eine erstellt.",
tags: ["Verbrauchsausweis Wohnen"],
tags: ["Verbrauchsausweis Gewerbe"],
},
input: z.object({
ausweis: VerbrauchsausweisGewerbeSchema.omit({

View File

@@ -1,33 +1,83 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types";
import { createCaller } from "../../../astro-typesafe-api-caller.js";
import { inferOutput } from "astro-typesafe-api/client";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
import { VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller";
const uid = Astro.url.searchParams.get("uid");
let ausweis: VerbrauchsausweisGewerbeClient = {
aufnahme: { objekt: {} },
} as VerbrauchsausweisGewerbeClient;
let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: UploadedGebaeudeBild[] = []
const valid = validateAccessTokenServer(Astro);
const caller = createCaller(Astro);
if (uid) {
ausweis = await caller.v1.verbrauchsausweisGewerbe.get({
uid: uid,
});
if (!ausweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
if (!valid) {
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
`/auth/login?redirect=${Astro.url.toString()}`
);
}
try {
let { uid_aufnahme, uid_objekt, uid_benutzer, ...result } = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
});
ausweis = result
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_aufnahme
}
})
objekt = await caller.objekt._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_objekt
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_objekt
}
})
if (!ausweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
} catch(e) {
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
}
---
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen">
<VerbrauchsausweisGewerbeModule client:load ausweis={ausweis}></VerbrauchsausweisGewerbeModule>
<VerbrauchsausweisGewerbeModule client:load {ausweis} {objekt} {aufnahme} {bilder} />
</AusweisLayout>