Merge pull request #259 from IBCornelsen/dev-moritz

Verbesserungen
This commit is contained in:
Moritz Utcke
2024-12-26 07:14:20 +07:00
committed by GitHub
15 changed files with 428 additions and 349 deletions

View File

@@ -9,22 +9,20 @@
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js"; import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { addNotification, deleteNotification } from "@ibcornelsen/ui"; import { addNotification, deleteNotification } from "@ibcornelsen/ui";
import TagInput from "../TagInput.svelte"; import TagInput from "../TagInput.svelte";
import type {
BedarfsausweisWohnen,
VerbrauchsausweisGewerbe,
} from "@ibcornelsen/database/client";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { import {
BedarfsausweisWohnenClient,
GebaeudeAufnahmeClient, GebaeudeAufnahmeClient,
GebaeudeClient, GebaeudeClient,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
export let gebaeude: GebaeudeClient; export let gebaeude: GebaeudeClient;
export let ausweis: export let ausweis:
| VerbrauchsausweisWohnenClient | VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbe | VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnen; | BedarfsausweisWohnenClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient; export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
</script> </script>

View File

@@ -1,39 +1,28 @@
<script lang="ts"> <script lang="ts">
import Hilfe from "#components/Ausweis/Hilfe.svelte"; import Hilfe from "#components/Ausweis/Hilfe.svelte";
export let spaeterWeitermachen; export let spaeterWeitermachen;
export let automatischAusfüllen; export let automatischAusfüllen;
</script> </script>
<!-- Später weitermachen / Hilfe anfordern --> <!-- Später weitermachen / Hilfe anfordern -->
<div <div
class="w-full mt-5 grid gap-x-4 gap-y-2 px-4 class="w-full mt-5 grid gap-x-4 gap-y-2 px-4
grid-cols-1 grid-cols-1
xs:grid-cols-2 xs:grid-cols-2
" "
> >
<div class="md:justify-self-start">
<button class="button" type="button" on:click={spaeterWeitermachen}
>Später Weitermachen
</button>
</div>
<div class="md:justify-self-start"> <div class="md:justify-self-end"><Hilfe /></div>
<button
class="button"
type="button"
on:click={spaeterWeitermachen}>Später Weitermachen
</button
>
</div>
<div class="md:justify-self-end"><Hilfe />
</div>
</div> </div>
<div class="mt-2 px-4"> <div class="mt-2 px-4">
<button <button class="button" on:click={automatischAusfüllen} type="button"
class="button" >Automatisch Ausfüllen
on:click={automatischAusfüllen} </button>
type="button">Automatisch Ausfüllen </div>
</button
>
</div>

View File

@@ -14,6 +14,7 @@
GebaeudeClient, GebaeudeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: GebaeudeClient; export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient; export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
@@ -81,6 +82,22 @@
} }
} }
$: {
console.log(month, year);
if ((availableDates.filter(date => date.month === month && date.year === year).length === 0) && typeof month === "number" && typeof year === "number") {
addNotification({
message: "Monat nicht verfügbar.",
subtext: "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.",
dismissable: true,
type: "warning",
timeout: 0,
uid: "monat_nicht_verfuegbar",
selector: "select[name='energieverbrauch_zeitraum_monat']"
})
}
}
$: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude); $: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude);
</script> </script>
@@ -147,7 +164,6 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={month} bind:value={month}
required required
> >
<option disabled>Monat</option>
{#if year !== null} {#if year !== null}
{#each availableDates.filter((date) => date.year == year) as date} {#each availableDates.filter((date) => date.year == year) as date}
<option value={date.month} <option value={date.month}
@@ -182,7 +198,6 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={year} bind:value={year}
required required
> >
<option disabled>Jahr</option>
{#each Array.from(availableDates.reduce((a, c) => { {#each Array.from(availableDates.reduce((a, c) => {
a.add(c.year); a.add(c.year);
return a; return a;

View File

@@ -109,7 +109,7 @@
{#if Object.keys($notifications).length > 0} {#if Object.keys($notifications).length > 0}
<span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span> <span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
{/if} {/if}
<button tabindex="0" class="btn btn-square btn-ghost hover:bg-base-200"> <button tabindex="0" class="button btn-square btn-ghost hover:bg-base-200">
<Bell size={24} /> <Bell size={24} />
</button> </button>
</div> </div>
@@ -119,7 +119,7 @@
</div> </div>
<a href="/dashboard/einstellungen" <a href="/dashboard/einstellungen"
class="btn btn-square btn-ghost hover:bg-base-200" class="button btn-square btn-ghost hover:bg-base-200"
> >
<Gear size={24} /> <Gear size={24} />
</a> </a>
@@ -129,7 +129,7 @@
<a <a
href="/dashboard/einstellungen" href="/dashboard/einstellungen"
use:ripple={rippleOptions} use:ripple={rippleOptions}
class="btn btn-ghost no-animation focus:shadow-none justify-start py-4 h-auto hover:bg-base-200 px-8 rounded-none w-full flex flex-row gap-4" class="button btn-ghost no-animation focus:shadow-none justify-start py-4 h-auto hover:bg-base-200 px-8 rounded-none w-full flex flex-row gap-4"
> >
<div class="avatar"> <div class="avatar">
<div class="w-12 rounded-full"> <div class="w-12 rounded-full">
@@ -173,9 +173,9 @@
font-family: Poppins !important; font-family: Poppins !important;
} }
.button-tab { /* .button-tab {
@apply btn btn-primary btn-ghost rounded-none px-8 justify-start outline-0 gap-4 items-center text-base font-normal text-base-content no-animation; @apply btn btn-primary btn-ghost rounded-none px-8 justify-start outline-0 gap-4 items-center text-base font-normal text-base-content no-animation;
} } */
.button-tab:hover { .button-tab:hover {
@apply bg-base-200 outline-0; @apply bg-base-200 outline-0;

View File

@@ -1,3 +1,5 @@
<script lang="ts"></script>
<div class="fixed right-8 bottom-8 max-w-[400px] flex flex-col gap-4 z-50"> <div class="fixed right-8 bottom-8 max-w-[400px] flex flex-col gap-4 z-50">
<slot></slot> <slot></slot>
</div> </div>

View File

@@ -20,6 +20,7 @@ export interface Notification {
type: "error" | "success" | "info" | "warning"; type: "error" | "success" | "info" | "warning";
onUserDismiss: () => any; onUserDismiss: () => any;
uid?: string; uid?: string;
selector?: string;
} }
export function updateNotification(uid: string, updater: Partial<Notification>) { export function updateNotification(uid: string, updater: Partial<Notification>) {

View File

@@ -1,5 +1,5 @@
--- ---
import HeaderLogin from "#header/headerLogin.svelte"; import HeaderLogin from "#header/HeaderLogin.svelte";
--- ---
<header id="header"> <header id="header">
@@ -58,7 +58,7 @@ lg:px-0 lg:gap-x-4">
</div> </div>
<div class="w-full justify-self-center"> <div class="w-full justify-self-center">
<HeaderLogin /> <HeaderLogin client:load />
</div> </div>
</div> </div>

View File

@@ -1,15 +1,12 @@
<script lang="ts"> <script lang="ts">
import { loginClient } from "#lib/login"; import { loginClient } from "#lib/login";
import CrossCircled from "radix-svelte-icons/src/lib/icons/CrossCircled.svelte"; import { CrossCircled } from "radix-svelte-icons";
import { fade } from "svelte/transition"; import { fade } from "svelte/transition";
let email: string; let email: string;
let passwort: string; let passwort: string;
async function login(e: SubmitEvent) { async function login(e: SubmitEvent) {
console.log(e);
e.preventDefault(); e.preventDefault();
const response = await loginClient(email, passwort); const response = await loginClient(email, passwort);
@@ -23,12 +20,14 @@
let errorHidden = true; let errorHidden = true;
</script> </script>
<div id="card-login" class="rounded-none lg:rounded-lg lg:card lg:box bg-black/10 md:bg-black/5 lg:ring-2 border-t-2 lg:border-none border-gray-500/50 ring-gray-500/50 xs:px-2 md:px-4 py-2" > <div
id="card-login"
class="rounded-none lg:rounded-lg lg:card lg:box bg-black/10 md:bg-black/5 lg:ring-2 border-t-2 lg:border-none border-gray-500/50 ring-gray-500/50 xs:px-2 md:px-4 py-2"
>
<form on:submit={login}> <form on:submit={login}>
<div class="grid grid-cols-[1fr] xs:grid-cols-[2fr_2fr_1fr] gap-2"> <div class="grid grid-cols-[1fr] xs:grid-cols-[2fr_2fr_1fr] gap-2">
<input <input
class="my-1 rounded-md px-2 py-1 w-full" class="my-1 rounded-md px-2 py-1 w-full"
type="text" type="text"
placeholder="nutzer@email.com" placeholder="nutzer@email.com"
autocomplete="off" autocomplete="off"
@@ -38,7 +37,7 @@
required required
/> />
<input <input
class="my-1 rounded-md px-2 py-1 w-full" class="my-1 rounded-md px-2 py-1 w-full"
type="password" type="password"
minlength="8" minlength="8"
placeholder="********" placeholder="********"
@@ -49,39 +48,41 @@
required required
/> />
{#if !errorHidden} {#if !errorHidden}
<div role="alert" class="alert alert-error" in:fade out:fade={{delay: 400}}> <div
<CrossCircled size={24} /> role="alert"
<span class="font-semibold">Das hat leider nicht geklappt, haben sie ihr Passwort und ihre Email Adresse richtig eingegeben?</span> class="alert alert-error"
</div> in:fade
out:fade={{ delay: 400 }}
>
<CrossCircled size={24} />
<span class="font-semibold"
>Das hat leider nicht geklappt, haben sie ihr Passwort
und ihre Email Adresse richtig eingegeben?</span
>
</div>
{/if} {/if}
<button class="button self-center" type="submit">login</button> <button class="button self-center" type="submit">login</button>
</div> </div>
<div
id="passwort-vergessen"
<div id="passwort-vergessen" class="grid grid-cols-1 lg:grid-cols-[3fr_2fr] gap-2"> class="grid grid-cols-1 lg:grid-cols-[3fr_2fr] gap-2"
>
<div class="w-full text-left self-center"> <div class="w-full text-left self-center">
<a <a
class="justify-self-start text-sm font-bold no-underline hover:text-primary" class="justify-self-start text-sm font-bold no-underline hover:text-primary"
href="/auth/signup">Registrieren</a href="/auth/signup">Registrieren</a
> / >
/
<a <a
class="justify-self-start text-sm font-bold no-underline hover:text-primary" class="justify-self-start text-sm font-bold no-underline hover:text-primary"
href="/auth/passwort-vergessen">Passwort vergessen</a href="/auth/passwort-vergessen">Passwort vergessen</a
> >
</div> </div>
</div> </div>
</form> </form>
</div>
</div>
<style lang="postcss"> <style lang="postcss">
</style> </style>

View File

@@ -0,0 +1,32 @@
<script lang="ts">
export let bereich: string;
export let title: string;
let open: boolean = true;
let collapse: HTMLDivElement;
</script>
<div class="bereichs-label">
<div>
<div
class="grid grid-cols-[max-content_1fr_40px] items-center justify-items-start gap-2"
>
<div class="formular-abschnitt1">{bereich}</div>
<div class="formular-abschnitt2">{title}</div>
<div
class="justify-self-center self-center cursor-pointer text-[2rem] ring-1 ring-secondary px-4 rounded-sm select-none"
on:click={() => {
open = !open
}}
>
{#if open}
-
{:else}
+
{/if}
</div>
</div>
</div>
</div>
<div class="collapseBereich" bind:this={collapse} class:max-h-0={!open} class:overflow-hidden={!open} class:max-h-[1500px]={open} class:overflow-visible={open}>
<slot></slot>
</div>

View File

@@ -1,46 +1,42 @@
<script lang="ts"> <script lang="ts">
export let bereich: string; export let bereich: string;
let label: HTMLDivElement;
let open: boolean = true;
function toggleBereich(event: MouseEvent) {
function toggleBereich(event){ var collapse = label.nextElementSibling as HTMLDivElement;
var x = event.target.parentNode.parentNode.parentNode; if (open) {
var y = x.nextElementSibling; //y.classList.remove('hidden');
var z = event.target.innerHTML; collapse.style.maxHeight = "0px";
collapse.style.overflow = "hidden";
if(z=='-'){ } else {
//y.classList.remove('hidden'); //y.classList.add('hidden');
y.style.maxHeight = '0px'; collapse.style.maxHeight = "1500px";
y.style.overflow = 'hidden'; collapse.style.overflow = "visible";
event.target.innerHTML = "+"; }
}else{
//y.classList.add('hidden');
y.style.maxHeight = '1500px';
y.style.overflow = 'visible';
event.target.innerHTML = "-";
}
}
open = !open;
}
</script> </script>
<div class="bereichs-label" bind:this={label}>
<div>
<div class="bereichs-label"> <div
class="grid grid-cols-[max-content_1fr_40px] items-center justify-items-start gap-2"
<div> >
<div class="grid grid-cols-[max-content_1fr_40px] items-center justify-items-start gap-2"> <div class="formular-abschnitt1">{bereich}</div>
<div class="formular-abschnitt1">{bereich}</div> <div class="formular-abschnitt2"><slot></slot></div>
<div class="formular-abschnitt2"><slot></slot></div> <div
<div id="BereichToggle" class="justify-self-center self-center cursor-pointer text-[2rem] ring-1 ring-secondary px-4 rounded-sm" on:click={() => toggleBereich(event)}>-</div> class="justify-self-center self-center cursor-pointer text-[2rem] ring-1 ring-secondary px-4 rounded-sm select-none"
on:click={toggleBereich}
>
{#if open}
-
{:else}
+
{/if}
</div>
</div>
</div> </div>
</div> </div>
</div>
<style lang="postcss">
</style>

View File

@@ -11,14 +11,23 @@
import moment from "moment"; import moment from "moment";
import { BitChecker } from "src/lib/BitChecker.js"; import { BitChecker } from "src/lib/BitChecker.js";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { BedarfsausweisWohnenClient, BenutzerClient, UploadedGebaeudeBild } from "#components/Ausweis/types.js"; import {
BedarfsausweisWohnenClient,
BenutzerClient,
UploadedGebaeudeBild,
} from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte";
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
export let ausweis: BedarfsausweisWohnenClient; export let ausweis: BedarfsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {}; let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {}; let gebaeude =
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || []; ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] =
ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten
?.gebaeude_bilder || [];
let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4]; let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4];
@@ -40,6 +49,29 @@
"Fenster mit U-Wert 1": 1, "Fenster mit U-Wert 1": 1,
}; };
async function spaeterWeitermachen() {
// const result = await verbrauchsausweisWohnenSpeichern(
// ausweis,
// gebaeude,
// gebaeude_aufnahme_allgemein,
// images,
// user
// );
// if (result !== null) {
// // 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;
// gebaeude_aufnahme_allgemein.uid = result.gebaeude_aufnahme_uid;
// window.history.pushState(
// {},
// "",
// `${location.pathname}?uid=${result.uid}`
// );
// speichernOverlayHidden = false;
// }
}
const arrayRange = (start: number, stop: number, step: number) => const arrayRange = (start: number, stop: number, step: number) =>
Array.from( Array.from(
{ length: (stop - start) / step + 1 }, { length: (stop - start) / step + 1 },
@@ -112,157 +144,160 @@
} }
</script> </script>
<div class="flex flex-row gap-8 items-center mb-8"> <div class="grid grid-cols-2 gap-x-8 px-4 items-center">
<div class="flex flex-col w-full"> <div class="w-full rounded-lg border-gray/35 border-0 relative px-4">
<h1>Bedarfsausweis erstellen - 75€</h1>
<Progressbar progress={0} /> <Progressbar progress={0} />
</div> </div>
<PerformanceScore {ausweis} {gebaeude} {gebaeude_aufnahme_allgemein} /> <div class="w-full rounded-lg border-gray/35 border-2 relative px-4">
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
/>
</div>
</div> </div>
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
<form action="FORM/transfer/VA_1to2" enctype="multipart/form-data"> <form action="FORM/transfer/VA_1to2" enctype="multipart/form-data">
<fieldset <div id="formular-box" class="formular-boxen ring-0">
class="bg-[rgba(252,234,187,0.2)] border-2 p-4 rounded-lg border-[#ffcc03]" <Bereich bereich="A" title="Prüfung der Ausweisart">
> <Ausweisart
<div class="flex flex-row justify-between"> bind:gebaeude
<a class="button" href="/speichern">Später Weitermachen</a> bind:gebaeude_aufnahme_allgemein
<div class="flex gap-4"> bind:ausweis
<Hilfe />
<button
on:click={automatischAusfüllen}
type="button"
class="button">Automatisch Ausfüllen</button
>
</div>
</div>
<hr />
<Label>A - Prüfung der Ausweisart</Label>
<Ausweisart bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:ausweis />
<hr />
<Label
>B - Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Gebäudetyp
und Gebäudeteil</Label
>
<div class="GRB">
<div>
<HelpLabel title="Straße, Hausnummer *"
>Bitte geben Sie hier die Straße und Hausnummer des Gebäudes
ein.</HelpLabel
>
<div>
<input
name="objekt_strasse"
class=" strasse"
type="text"
bind:value={ausweis.objekt_strasse}
required
/>
</div>
</div>
<ZipSearch
bind:zip={ausweis.objekt_plz}
bind:city={ausweis.objekt_ort}
name="zip"
/> />
</Bereich>
<div> <hr />
<HelpLabel title="Ort *" <Bereich
>Ort des Gebäudes wird automatisch ermittelt.</HelpLabel bereich="B"
> title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Gebäudetyp und Gebäudeteil"
>
<div class="GRB">
<div> <div>
<input <HelpLabel title="Straße, Hausnummer *"
name="objekt_ort" >Bitte geben Sie hier die Straße und Hausnummer des
type="text" Gebäudes ein.</HelpLabel
bind:value={ausweis.objekt_ort}
/>
</div>
</div>
<div>
<HelpLabel title="Wohnfläche m² *"
>Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
Dabei handelt es sich um die Wohnfläche abzüglich
vorhandener Flächen die sich außerhalb des Gebäudes
befinden. (Balkone, Terassen,etc.).</HelpLabel
>
<div>
<input
name="wohnflaeche"
type="number"
required
bind:value={ausweis.wohnflaeche}
/>
</div>
</div>
<div>
<HelpLabel title="Gebäudetyp *"
>Bitte wählen Sie hier den Gebäudetyp aus.
</HelpLabel>
<div>
<select
name="objekt_typ"
bind:value={ausweis.objekt_typ}
required
> >
<option>Bitte auswählen</option> <div>
<option value="Einfamilienhaus"> <input
Einfamilienhaus</option name="objekt_strasse"
> class=" strasse"
<option value="Freistehendes Einfamilienhaus"> type="text"
Freistehendes Einfamilienhaus</option bind:value={ausweis.objekt_strasse}
> required
<option value="Freistehendes Zweifamilienhaus"> />
Freistehendes Zweifamilienhaus</option </div>
>
<option value="Doppelhaushälfte">
Doppelhaushälfte</option
>
<option value="Reihenendhaus"> Reihenendhaus</option>
<option value="Reihenmittelhaus">
Reihenmittelhaus</option
>
<option value="Mehrfamilienhaus">
Mehrfamilienhaus</option
>
<option value="Wohn- und Geschäftshaus">
Wohn- und Geschäftshaus</option
>
<option value="Atrium-Bungalow">
Atrium-Bungalow</option
>
<option value="Winkelbungalow"> Winkelbungalow</option>
</select>
</div> </div>
</div>
<div> <ZipSearch
<HelpLabel title="Gebäudeteil *" bind:zip={ausweis.objekt_plz}
>Bitte geben Sie hier den Gebäudeteil ein. In den meisten bind:city={ausweis.objekt_ort}
Fällen handelt es sich um das Gesamtgebäude. Sollte es sich name="zip"
allerdings um ein Gebäude mit mehr als 10% Gewerbeanteil />
handeln, so sollten 2 Ausweise erstellt werden. In diesem
Fall wählen Sie Gebäudeteil 'Wohnen' bzw. Gebäudeteil
'Gewerbe'.</HelpLabel
>
<div> <div>
<select <HelpLabel title="Ort *"
name="objekt_gebaeudeteil" >Ort des Gebäudes wird automatisch ermittelt.</HelpLabel
bind:value={ausweis.objekt_gebaeudeteil}
required
> >
<option>Bitte auswählen</option> <div>
<option value="Gesamtgebäude"> Gesamtgebäude</option> <input
<option value="Wohnen"> Wohnen</option> name="objekt_ort"
</select> type="text"
bind:value={ausweis.objekt_ort}
/>
</div>
</div>
<div>
<HelpLabel title="Wohnfläche m² *"
>Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
Dabei handelt es sich um die Wohnfläche abzüglich
vorhandener Flächen die sich außerhalb des Gebäudes
befinden. (Balkone, Terassen,etc.).</HelpLabel
>
<div>
<input
name="wohnflaeche"
type="number"
required
bind:value={ausweis.wohnflaeche}
/>
</div>
</div>
<div>
<HelpLabel title="Gebäudetyp *"
>Bitte wählen Sie hier den Gebäudetyp aus.
</HelpLabel>
<div>
<select
name="objekt_typ"
bind:value={ausweis.objekt_typ}
required
>
<option>Bitte auswählen</option>
<option value="Einfamilienhaus">
Einfamilienhaus</option
>
<option value="Freistehendes Einfamilienhaus">
Freistehendes Einfamilienhaus</option
>
<option value="Freistehendes Zweifamilienhaus">
Freistehendes Zweifamilienhaus</option
>
<option value="Doppelhaushälfte">
Doppelhaushälfte</option
>
<option value="Reihenendhaus">
Reihenendhaus</option
>
<option value="Reihenmittelhaus">
Reihenmittelhaus</option
>
<option value="Mehrfamilienhaus">
Mehrfamilienhaus</option
>
<option value="Wohn- und Geschäftshaus">
Wohn- und Geschäftshaus</option
>
<option value="Atrium-Bungalow">
Atrium-Bungalow</option
>
<option value="Winkelbungalow">
Winkelbungalow</option
>
</select>
</div>
</div>
<div>
<HelpLabel title="Gebäudeteil *"
>Bitte geben Sie hier den Gebäudeteil ein. In den
meisten Fällen handelt es sich um das Gesamtgebäude.
Sollte es sich allerdings um ein Gebäude mit mehr als
10% Gewerbeanteil handeln, so sollten 2 Ausweise
erstellt werden. In diesem Fall wählen Sie Gebäudeteil
'Wohnen' bzw. Gebäudeteil 'Gewerbe'.</HelpLabel
>
<div>
<select
name="objekt_gebaeudeteil"
bind:value={ausweis.objekt_gebaeudeteil}
required
>
<option>Bitte auswählen</option>
<option value="Gesamtgebäude">
Gesamtgebäude</option
>
<option value="Wohnen"> Wohnen</option>
</select>
</div>
</div> </div>
</div> </div>
</div> </Bereich>
<hr /> <hr />
<Label <Label
@@ -874,9 +909,17 @@
required required
> >
<option> Bitte auswählen</option> <option> Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}> nicht vorhanden</option> <option
<option value={Enums.Heizungsstatus.UNBEHEIZT}> unbeheizt</option> value={Enums.Heizungsstatus.NICHT_VORHANDEN}
<option value={Enums.Heizungsstatus.BEHEIZT}> beheizt</option> >
nicht vorhanden</option
>
<option value={Enums.Heizungsstatus.UNBEHEIZT}>
unbeheizt</option
>
<option value={Enums.Heizungsstatus.BEHEIZT}>
beheizt</option
>
</select> </select>
</div> </div>
</div> </div>
@@ -1304,10 +1347,15 @@
>G - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des >G - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes</Label Gebäudes</Label
> >
<BilderZusatzsysteme {ausweis} {gebaeude} {gebaeude_aufnahme_allgemein} {images} /> <BilderZusatzsysteme
{ausweis}
{gebaeude}
{gebaeude_aufnahme_allgemein}
{images}
/>
<hr /> <hr />
<div class="flex flex-row justify-between"> <div class="flex flex-row justify-between">
<button class="button">Weiter</button> <button class="button">Weiter</button>
</div> </div>
</fieldset> </div>
</form> </form>

View File

@@ -98,7 +98,6 @@
gebaeude gebaeude
}) })
}) })
// TODO: Ticket mit Fehldermeldung abschicken.
} }
addNotification({ addNotification({

View File

@@ -3,12 +3,11 @@
import Progressbar from "#components/Ausweis/Progressbar.svelte"; import Progressbar from "#components/Ausweis/Progressbar.svelte";
import Hilfe from "#components/Ausweis/Hilfe.svelte"; import Hilfe from "#components/Ausweis/Hilfe.svelte";
import BereichLabel from "#labels/BereichLabel.svelte"; import Bereich from "#labels/Bereich.svelte";
//import HelpLabel from "#labels/HelpLabel.svelte"; //import HelpLabel from "#labels/HelpLabel.svelte";
//import Inputlabel from "#labels/InputLabel.svelte"; //import Inputlabel from "#labels/InputLabel.svelte";
//import Label from "#components/Label.svelte"; //import Label from "#components/Label.svelte";
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte"; import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
import Ausweisart from "#components/Ausweis/Ausweisart.svelte"; import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte"; import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
@@ -24,11 +23,12 @@
import AusweisPreviewContainer from "#components/Ausweis/AusweisPreviewContainer.svelte"; import AusweisPreviewContainer from "#components/Ausweis/AusweisPreviewContainer.svelte";
//import ZipSearch from "#components/PlzSuche.svelte"; //import ZipSearch from "#components/PlzSuche.svelte";
import { import {
RawNotificationWrapper, RawNotificationWrapper,
RawNotification, RawNotification,
notifications, notifications,
deleteNotification,
} from "#components/Notifications/index.js"; } from "#components/Notifications/index.js";
import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js"; import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { auditHeizungJuengerDreiJahre } from "#components/Verbrauchsausweis/audits/HeizungJuengerDreiJahre.js"; import { auditHeizungJuengerDreiJahre } from "#components/Verbrauchsausweis/audits/HeizungJuengerDreiJahre.js";
@@ -57,14 +57,13 @@
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js"; import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
import AusweisWeiter from "./AusweisWeiter.svelte"; import AusweisWeiter from "./AusweisWeiter.svelte";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { OpenInNewWindow } from "radix-svelte-icons";
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann // TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
// wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert... // wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert...
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {}; let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = let gebaeude =
ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {}; ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
@@ -101,11 +100,13 @@
gebaeude_aufnahme_allgemein.baujahr_heizung = [1952]; gebaeude_aufnahme_allgemein.baujahr_heizung = [1952];
gebaeude_aufnahme_allgemein.saniert = true; gebaeude_aufnahme_allgemein.saniert = true;
gebaeude_aufnahme_allgemein.einheiten = 1; gebaeude_aufnahme_allgemein.einheiten = 1;
gebaeude_aufnahme_allgemein.gebaeudetyp = "Einfamilienhaus" gebaeude_aufnahme_allgemein.gebaeudetyp = "Einfamilienhaus";
gebaeude_aufnahme_allgemein.keller = Enums.Heizungsstatus.NICHT_VORHANDEN gebaeude_aufnahme_allgemein.keller =
gebaeude_aufnahme_allgemein.dachgeschoss = Enums.Heizungsstatus.NICHT_VORHANDEN Enums.Heizungsstatus.NICHT_VORHANDEN;
gebaeude_aufnahme_allgemein.lueftung = "Fensterlüftung" gebaeude_aufnahme_allgemein.dachgeschoss =
gebaeude_aufnahme_allgemein.kuehlung = "1" Enums.Heizungsstatus.NICHT_VORHANDEN;
gebaeude_aufnahme_allgemein.lueftung = "Fensterlüftung";
gebaeude_aufnahme_allgemein.kuehlung = "1";
ausweis.ausstellgrund = "Vermietung"; ausweis.ausstellgrund = "Vermietung";
ausweis.verbrauch_1 = 15000; ausweis.verbrauch_1 = 15000;
ausweis.verbrauch_2 = 14000; ausweis.verbrauch_2 = 14000;
@@ -113,7 +114,7 @@
gebaeude_aufnahme_allgemein.flaeche = 152; gebaeude_aufnahme_allgemein.flaeche = 152;
gebaeude_aufnahme_allgemein.nutzflaeche = 172; gebaeude_aufnahme_allgemein.nutzflaeche = 172;
ausweis.keller_beheizt = true; ausweis.keller_beheizt = true;
gebaeude_aufnahme_allgemein.brennstoff_1 = "Erdgas H"; gebaeude_aufnahme_allgemein.brennstoff_1 = "Erdgas H";
ausweis.einheit_1 = "kWh"; ausweis.einheit_1 = "kWh";
ausweis.anteil_warmwasser_1 = 18; ausweis.anteil_warmwasser_1 = 18;
@@ -168,8 +169,6 @@
} }
</script> </script>
<Overlay bind:hidden={speichernOverlayHidden}> <Overlay bind:hidden={speichernOverlayHidden}>
<div class="bg-white w-full max-w-screen-sm py-8 px-8"> <div class="bg-white w-full max-w-screen-sm py-8 px-8">
<AusweisGespeichertModule uid={ausweis.uid}></AusweisGespeichertModule> <AusweisGespeichertModule uid={ausweis.uid}></AusweisGespeichertModule>
@@ -184,158 +183,155 @@
<h1>Verbrauchsausweis erstellen - 45€</h1> <h1>Verbrauchsausweis erstellen - 45€</h1>
<div class="grid grid-cols-2 gap-x-8 px-4 items-center"> <div class="grid grid-cols-2 gap-x-8 px-4 items-center">
<div class="w-full rounded-lg border-gray/35 border-0 relative px-4"> <div class="w-full rounded-lg border-gray/35 border-0 relative px-4">
<Progressbar progress={0} /> <Progressbar progress={0} />
</div> </div>
<div class="w-full rounded-lg border-gray/35 border-2 relative px-4"> <div class="w-full rounded-lg border-gray/35 border-2 relative px-4">
<PerformanceScore <PerformanceScore
bind:ausweis bind:ausweis
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:gebaeude bind:gebaeude
/> />
</div> </div>
</div> </div>
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen}/> <ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
<form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis"> <form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
<div id="formular-box" class="formular-boxen ring-0"> <div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart --> <!-- A Prüfung der Ausweisart -->
<BereichLabel bereich="A">Prüfung der Ausweisart</BereichLabel> <Bereich bereich="A" title="Prüfung der Ausweisart">
<div class="collapseBereich">
<Ausweisart <Ausweisart
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> />
</div> </Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss --> <!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
<BereichLabel bereich="B" <Bereich
>Eingabe&nbsp;der&nbsp;Gebäudeadresse - bereich="B"
Angaben&nbsp;zu&nbsp;Wohnfläche, Keller&nbsp;und&nbsp;Dachgeschoss</BereichLabel title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
><GebaeudeDaten bind:gebaeude_aufnahme_allgemein /></Bereich
> >
<div class="collapseBereich">
<GebaeudeDaten bind:gebaeude_aufnahme_allgemein />
</div>
<!-- C Eingabe von 3 zusammenhängenden Verbrauchsjahren --> <!-- C Eingabe von 3 zusammenhängenden Verbrauchsjahren -->
<BereichLabel bereich="C" <Bereich
>Eingabe von 3&nbsp;zusammenhängenden Verbrauchsjahren</BereichLabel bereich="C"
> title="Eingabe von 3 zusammenhängenden Verbrauchsjahren"
<div class="collapseBereich"> ><Verbrauch
<Verbrauch
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- D Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen --> <!-- D Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen -->
<BereichLabel bereich="D" <Bereich
>Eingabe&nbsp;Warmwasseranteil bereich="D"
und&nbsp;Verwendung&nbsp;von&nbsp;alternativen title="Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen"
Energieversorgungssystemen</BereichLabel ><Warmwasseranteil bind:ausweis /></Bereich
> >
<div class="collapseBereich">
<Warmwasseranteil bind:ausweis />
</div>
<!-- E Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand --> <!-- E Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand -->
<BereichLabel bereich="E" <Bereich
>Eingabe&nbsp;von&nbsp;Gebäudeteil, bereich="E"
Lüftung,&nbsp;Kühlung&nbsp;und&nbsp;Leerstand</BereichLabel title="Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand"
><LueftungundLeerstand bind:gebaeude_aufnahme_allgemein /></Bereich
> >
<div class="collapseBereich">
<LueftungundLeerstand bind:gebaeude_aufnahme_allgemein />
</div>
<!-- F Angaben zur Heizungsanlage --> <!-- F Angaben zur Heizungsanlage -->
<BereichLabel bereich="F" <Bereich bereich="F" title="Angaben zur Heizunganlage"
>Angaben zur Heizunganlage</BereichLabel ><SanierungszustandHeizungsanlage
>
<div class="collapseBereich">
<SanierungszustandHeizungsanlage
bind:images bind:images
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- G Angaben zur Fenster, Dachfenster und Türen --> <!-- G Angaben zur Fenster, Dachfenster und Türen -->
<BereichLabel bereich="G" <Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
>Angaben zu Fenster, Dachfenster und Türen</BereichLabel ><SanierungszustandFensterTueren
>
<div class="collapseBereich">
<SanierungszustandFensterTueren
bind:images bind:images
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- H Angaben zur Wärmedammung --> <!-- H Angaben zur Wärmedammung -->
<BereichLabel bereich="H" <Bereich bereich="H" title="Angaben zur Wärmedämmung"
>Angaben zur Wärmedämmung</BereichLabel ><SanierungszustandWaermedammung
>
<div class="collapseBereich">
<SanierungszustandWaermedammung
bind:images bind:images
bind:gebaeude bind:gebaeude
bind:gebaeude_aufnahme_allgemein bind:gebaeude_aufnahme_allgemein
bind:ausweis bind:ausweis
/> /></Bereich
</div> >
<!-- I Gebäudebild und Energieausweis PDF Vorschau --> <!-- I Gebäudebild und Energieausweis PDF Vorschau -->
<BereichLabel bereich="I" <Bereich bereich="I" title="Gebäudebild und Energieausweis PDF Vorschau"
>Gebäudebild und Energieausweis PDF Vorschau</BereichLabel ><AusweisPreviewContainer
bind:images
bind:ausweis
bind:gebaeude
/></Bereich
> >
<div class="collapseBereich">
<AusweisPreviewContainer
bind:images
bind:ausweis
bind:gebaeude />
</div>
</div> </div>
<div <div
class="w-full px-4 mt-5 grid gap-x-4 gap-y-2 class="w-full px-4 mt-5 grid gap-x-4 gap-y-2
grid-cols-1 grid-cols-1
xs:grid-cols-2" xs:grid-cols-2"
> >
<div class="md:justify-self-start">
<AusweisWeiter
bind:ausweis
bind:images
bind:user
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
></AusweisWeiter>
</div>
<div class="md:justify-self-start"> <div class="md:justify-self-end"><Hilfe /></div>
<AusweisWeiter bind:ausweis bind:images bind:user bind:gebaeude bind:gebaeude_aufnahme_allgemein></AusweisWeiter> </div>
</div>
<div class="md:justify-self-end"><Hilfe />
</div>
</div>
</form> </form>
<RawNotificationWrapper> <RawNotificationWrapper>
{#each Object.entries($notifications) as [uid, notification] (uid)} {#each Object.entries($notifications) as [uid, notification] (uid)}
<RawNotification notification={{ ...notification, uid }}> <RawNotification notification={{ ...notification, uid }}>
{@html notification.subtext} {@html notification.subtext}
{#if notification.selector}
<button on:click={() => {
const element = document.querySelector(notification.selector);
element?.classList.add("bg-red-300")
element?.scrollIntoView({
behavior: "smooth",
block: "center",
inline: "center"
})
element.focus()
deleteNotification(notification.uid)
setTimeout(() => {
element?.classList.remove("bg-red-300")
}, 3000)
}} class="px-4 py-2 border rounded-lg mt-2 flex flex-row text-base gap-2 font-bold" title="Anzeigen"><OpenInNewWindow size={22}></OpenInNewWindow> Anzeigen</button>
{/if}
</RawNotification> </RawNotification>
{/each} {/each}
@@ -520,7 +516,7 @@ xs:grid-cols-2"
für den Bedarfsausweis zu gelangen. für den Bedarfsausweis zu gelangen.
</RawNotification> </RawNotification>
{/if} {/if}
{#if auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein).length > 0} {#if auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein).length > 0}
<RawNotification <RawNotification
notification={{ notification={{
@@ -537,10 +533,12 @@ xs:grid-cols-2"
> >
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung( Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(
ausweis, ausweis,
gebaeude_aufnahme_allgemein, gebaeude_aufnahme_allgemein
)[0]} und {auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein)[1]} beträgt mehr )[0]} und {auditVerbrauchAbweichung(
als 30% und sie haben keinen Leerstand angegeben. Sind sie sich sicher, ausweis,
dass das stimmt? gebaeude_aufnahme_allgemein
)[1]} beträgt mehr als 30% und sie haben keinen Leerstand angegeben.
Sind sie sich sicher, dass das stimmt?
</RawNotification> </RawNotification>
{/if} {/if}

View File

@@ -146,7 +146,7 @@ xs:grid-cols-2
</div> </div>
<div class="mt-2"><button class="button hidden" on:click={automatischAusfüllen} type="button" >Automatisch Ausfüllen</button></div> <div class="mt-2"><button class="button" on:click={automatischAusfüllen} type="button" >Automatisch Ausfüllen</button></div>
<hr /> <hr />

View File

@@ -1,7 +1,7 @@
--- ---
import AusweisLayout from "#layouts/AusweisLayout.astro"; import AusweisLayout from "#layouts/AusweisLayout.astro";
import BedarfsausweisContent from "#modules/BedarfsausweisWohnen/BedarfsausweisContent.svelte"; import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte";
import { BedarfsausweisWohnenClient } from "#components/Ausweis/types"; import { BedarfsausweisWohnenClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller"; import { createCaller } from "#lib/caller";
@@ -31,5 +31,5 @@ if (uid) {
--- ---
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen"> <AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
<BedarfsausweisContent client:load ausweis={ausweis}></BedarfsausweisContent> <BedarfsausweisWohnenModule client:load ausweis={ausweis}></BedarfsausweisWohnenModule>
</AusweisLayout> </AusweisLayout>