Merge pull request #261 from IBCornelsen/main

Update Jens
This commit is contained in:
Jens Cornelsen
2024-12-26 04:05:52 +01:00
committed by GitHub
17 changed files with 468 additions and 367 deletions

View File

@@ -9,22 +9,20 @@
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { addNotification, deleteNotification } from "@ibcornelsen/ui";
import TagInput from "../TagInput.svelte";
import type {
BedarfsausweisWohnen,
VerbrauchsausweisGewerbe,
} from "@ibcornelsen/database/client";
import { Enums } from "@ibcornelsen/database/client";
import {
BedarfsausweisWohnenClient,
GebaeudeAufnahmeClient,
GebaeudeClient,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
export let gebaeude: GebaeudeClient;
export let ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbe
| BedarfsausweisWohnen;
| VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnenClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
</script>
@@ -128,11 +126,10 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
name="saniert"
class=""
required
bind:value={gebaeude_aufnahme_allgemein.saniert}
>
<option disabled selected value={false}>Bitte auswählen</option>
<option disabled selected>Bitte auswählen</option>
<option value={true}>saniert</option>
<option value={false}>unsaniert</option>
</select>

View File

@@ -1,39 +1,28 @@
<script lang="ts">
import Hilfe from "#components/Ausweis/Hilfe.svelte";
export let spaeterWeitermachen;
export let automatischAusfüllen;
import Hilfe from "#components/Ausweis/Hilfe.svelte";
export let spaeterWeitermachen;
export let automatischAusfüllen;
</script>
<!-- Später weitermachen / Hilfe anfordern -->
<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
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">
<button
class="button"
type="button"
on:click={spaeterWeitermachen}>Später Weitermachen
</button
>
</div>
<div class="md:justify-self-end"><Hilfe />
</div>
<div class="md:justify-self-end"><Hilfe /></div>
</div>
<div class="mt-2 px-4">
<button
class="button hidden"
on:click={automatischAusfüllen}
type="button">Automatisch Ausfüllen
</button
>
<button class="button" on:click={automatischAusfüllen} type="button"
>Automatisch Ausfüllen
</button>
</div>

View File

@@ -50,21 +50,7 @@
/>
</div>
</div>
<div class="flex flex-row justify-between mx-4 my-2">
<div class="form-group col-md-7">
Bedarfsausweis offline für 290 € inkl. MwSt. (Sie schicken
uns Grundriss- und Ansichtspläne zu)
</div>
<div class="form-group col-md-5">
<input
type="radio"
class="IGanlass"
id="Produktbof1"
value="pbof"
name="Produkt"
/>
</div>
</div>
<div style="text-align:right;">
<button>Weiter</button>

View File

@@ -14,6 +14,7 @@
GebaeudeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import { addNotification } from "#components/Notifications/shared.js";
export let gebaeude: GebaeudeClient;
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);
</script>
@@ -147,7 +164,6 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={month}
required
>
<option disabled>Monat</option>
{#if year !== null}
{#each availableDates.filter((date) => date.year == year) as date}
<option value={date.month}
@@ -182,7 +198,6 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={year}
required
>
<option disabled>Jahr</option>
{#each Array.from(availableDates.reduce((a, c) => {
a.add(c.year);
return a;

View File

@@ -109,7 +109,7 @@
{#if Object.keys($notifications).length > 0}
<span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
{/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} />
</button>
</div>
@@ -119,7 +119,7 @@
</div>
<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} />
</a>
@@ -129,7 +129,7 @@
<a
href="/dashboard/einstellungen"
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="w-12 rounded-full">
@@ -173,9 +173,9 @@
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;
}
} */
.button-tab:hover {
@apply bg-base-200 outline-0;

View File

@@ -1,4 +1,5 @@
<script lang="ts">
import { OpenInNewWindow } from "radix-svelte-icons";
import { Notification, deleteNotification } from "./shared.js";
import { fly } from "svelte/transition";
@@ -13,7 +14,34 @@
class:border-l-yellow-400={notification.type == "warning"}
>
<div class="flex flex-col px-4 py-2">
<h2 class="text-xl font-semibold">{@html notification.message}</h2>
<h2 class="text-xl font-semibold flex flex-row items-center gap-3">{@html notification.message} {#if notification.selector}
<button on:click={() => {
if (!notification.selector) {
return
}
const element = document.querySelector(notification.selector);
if (!element) {
return
}
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="p-1.5 border rounded-lg" title="Anzeigen"><OpenInNewWindow size={18}></OpenInNewWindow></button>
{/if}</h2>
<p class="text-gray-600 text-lg"><slot></slot></p>
</div>
{#if notification.dismissable}

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">
<slot></slot>
</div>

View File

@@ -20,6 +20,7 @@ export interface Notification {
type: "error" | "success" | "info" | "warning";
onUserDismiss: () => any;
uid?: string;
selector?: string;
}
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">
@@ -58,7 +58,7 @@ lg:px-0 lg:gap-x-4">
</div>
<div class="w-full justify-self-center">
<HeaderLogin />
<HeaderLogin client:load />
</div>
</div>

View File

@@ -1,15 +1,12 @@
<script lang="ts">
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";
let email: string;
let passwort: string;
async function login(e: SubmitEvent) {
console.log(e);
e.preventDefault();
const response = await loginClient(email, passwort);
@@ -23,12 +20,14 @@
let errorHidden = true;
</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}>
<div class="grid grid-cols-[1fr] xs:grid-cols-[2fr_2fr_1fr] gap-2">
<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"
placeholder="nutzer@email.com"
autocomplete="off"
@@ -38,7 +37,7 @@
required
/>
<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"
minlength="8"
placeholder="********"
@@ -49,39 +48,41 @@
required
/>
{#if !errorHidden}
<div role="alert" class="alert alert-error" 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>
<div
role="alert"
class="alert alert-error"
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}
<button class="button self-center" type="submit">login</button>
</div>
<div id="passwort-vergessen" class="grid grid-cols-1 lg:grid-cols-[3fr_2fr] gap-2">
<div
id="passwort-vergessen"
class="grid grid-cols-1 lg:grid-cols-[3fr_2fr] gap-2"
>
<div class="w-full text-left self-center">
<a
class="justify-self-start text-sm font-bold no-underline hover:text-primary"
href="/auth/signup">Registrieren</a
> /
>
/
<a
class="justify-self-start text-sm font-bold no-underline hover:text-primary"
href="/auth/passwort-vergessen">Passwort vergessen</a
>
</div>
</div>
</form>
</div>
</div>
<style lang="postcss">
</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">
export let bereich: string;
let label: HTMLDivElement;
let open: boolean = true;
function toggleBereich(event: MouseEvent) {
var collapse = label.nextElementSibling as HTMLDivElement;
function toggleBereich(event){
var x = event.target.parentNode.parentNode.parentNode;
var y = x.nextElementSibling;
var z = event.target.innerHTML;
if(z=='-'){
//y.classList.remove('hidden');
y.style.maxHeight = '0px';
y.style.overflow = 'hidden';
event.target.innerHTML = "+";
}else{
//y.classList.add('hidden');
y.style.maxHeight = '1500px';
y.style.overflow = 'visible';
event.target.innerHTML = "-";
}
}
if (open) {
//y.classList.remove('hidden');
collapse.style.maxHeight = "0px";
collapse.style.overflow = "hidden";
} else {
//y.classList.add('hidden');
collapse.style.maxHeight = "1500px";
collapse.style.overflow = "visible";
}
open = !open;
}
</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"><slot></slot></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>
<div class="bereichs-label" bind:this={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"><slot></slot></div>
<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>
<style lang="postcss">
</style>

View File

@@ -11,14 +11,23 @@
import moment from "moment";
import { BitChecker } from "src/lib/BitChecker.js";
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 user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || [];
let gebaeude =
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];
@@ -40,6 +49,29 @@
"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) =>
Array.from(
{ length: (stop - start) / step + 1 },
@@ -112,157 +144,160 @@
}
</script>
<div class="flex flex-row gap-8 items-center mb-8">
<div class="flex flex-col w-full">
<h1>Bedarfsausweis erstellen - 75€</h1>
<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">
<Progressbar progress={0} />
</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>
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
<form action="FORM/transfer/VA_1to2" enctype="multipart/form-data">
<fieldset
class="bg-[rgba(252,234,187,0.2)] border-2 p-4 rounded-lg border-[#ffcc03]"
>
<div class="flex flex-row justify-between">
<a class="button" href="/speichern">Später Weitermachen</a>
<div class="flex gap-4">
<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"
<div id="formular-box" class="formular-boxen ring-0">
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:ausweis
/>
</Bereich>
<div>
<HelpLabel title="Ort *"
>Ort des Gebäudes wird automatisch ermittelt.</HelpLabel
>
<hr />
<Bereich
bereich="B"
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Gebäudetyp und Gebäudeteil"
>
<div class="GRB">
<div>
<input
name="objekt_ort"
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
<HelpLabel title="Straße, Hausnummer *"
>Bitte geben Sie hier die Straße und Hausnummer des
Gebäudes ein.</HelpLabel
>
<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>
<input
name="objekt_strasse"
class=" strasse"
type="text"
bind:value={ausweis.objekt_strasse}
required
/>
</div>
</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
>
<ZipSearch
bind:zip={ausweis.objekt_plz}
bind:city={ausweis.objekt_ort}
name="zip"
/>
<div>
<select
name="objekt_gebaeudeteil"
bind:value={ausweis.objekt_gebaeudeteil}
required
<HelpLabel title="Ort *"
>Ort des Gebäudes wird automatisch ermittelt.</HelpLabel
>
<option>Bitte auswählen</option>
<option value="Gesamtgebäude"> Gesamtgebäude</option>
<option value="Wohnen"> Wohnen</option>
</select>
<div>
<input
name="objekt_ort"
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>
</Bereich>
<hr />
<Label
@@ -874,9 +909,17 @@
required
>
<option> Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}> nicht vorhanden</option>
<option value={Enums.Heizungsstatus.UNBEHEIZT}> unbeheizt</option>
<option value={Enums.Heizungsstatus.BEHEIZT}> beheizt</option>
<option
value={Enums.Heizungsstatus.NICHT_VORHANDEN}
>
nicht vorhanden</option
>
<option value={Enums.Heizungsstatus.UNBEHEIZT}>
unbeheizt</option
>
<option value={Enums.Heizungsstatus.BEHEIZT}>
beheizt</option
>
</select>
</div>
</div>
@@ -1304,10 +1347,15 @@
>G - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes</Label
>
<BilderZusatzsysteme {ausweis} {gebaeude} {gebaeude_aufnahme_allgemein} {images} />
<BilderZusatzsysteme
{ausweis}
{gebaeude}
{gebaeude_aufnahme_allgemein}
{images}
/>
<hr />
<div class="flex flex-row justify-between">
<button class="button">Weiter</button>
</div>
</fieldset>
</div>
</form>

View File

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

View File

@@ -3,12 +3,11 @@
import Progressbar from "#components/Ausweis/Progressbar.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 Inputlabel from "#labels/InputLabel.svelte";
//import Label from "#components/Label.svelte";
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
@@ -29,6 +28,7 @@
RawNotificationWrapper,
RawNotification,
notifications,
deleteNotification,
} from "#components/Notifications/index.js";
import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { auditHeizungJuengerDreiJahre } from "#components/Verbrauchsausweis/audits/HeizungJuengerDreiJahre.js";
@@ -57,14 +57,13 @@
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
import AusweisWeiter from "./AusweisWeiter.svelte";
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
// wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert...
export let ausweis: VerbrauchsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude =
ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
@@ -101,11 +100,13 @@
gebaeude_aufnahme_allgemein.baujahr_heizung = [1952];
gebaeude_aufnahme_allgemein.saniert = true;
gebaeude_aufnahme_allgemein.einheiten = 1;
gebaeude_aufnahme_allgemein.gebaeudetyp = "Einfamilienhaus"
gebaeude_aufnahme_allgemein.keller = Enums.Heizungsstatus.NICHT_VORHANDEN
gebaeude_aufnahme_allgemein.dachgeschoss = Enums.Heizungsstatus.NICHT_VORHANDEN
gebaeude_aufnahme_allgemein.lueftung = "Fensterlüftung"
gebaeude_aufnahme_allgemein.kuehlung = "1"
gebaeude_aufnahme_allgemein.gebaeudetyp = "Einfamilienhaus";
gebaeude_aufnahme_allgemein.keller =
Enums.Heizungsstatus.NICHT_VORHANDEN;
gebaeude_aufnahme_allgemein.dachgeschoss =
Enums.Heizungsstatus.NICHT_VORHANDEN;
gebaeude_aufnahme_allgemein.lueftung = "Fensterlüftung";
gebaeude_aufnahme_allgemein.kuehlung = "1";
ausweis.ausstellgrund = "Vermietung";
ausweis.verbrauch_1 = 15000;
ausweis.verbrauch_2 = 14000;
@@ -168,8 +169,6 @@
}
</script>
<Overlay bind:hidden={speichernOverlayHidden}>
<div class="bg-white w-full max-w-screen-sm py-8 px-8">
<AusweisGespeichertModule uid={ausweis.uid}></AusweisGespeichertModule>
@@ -184,152 +183,129 @@
<h1>Verbrauchsausweis erstellen - 45€</h1>
<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">
<Progressbar progress={0} />
</div>
<div class="w-full rounded-lg border-gray/35 border-2 relative px-4">
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
/>
<PerformanceScore
bind:ausweis
bind:gebaeude_aufnahme_allgemein
bind:gebaeude
/>
</div>
</div>
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen}/>
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
<form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
<div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart -->
<BereichLabel bereich="A">Prüfung der Ausweisart</BereichLabel>
<div class="collapseBereich">
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:ausweis
/>
</div>
</Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
<BereichLabel bereich="B"
>Eingabe&nbsp;der&nbsp;Gebäudeadresse -
Angaben&nbsp;zu&nbsp;Wohnfläche, Keller&nbsp;und&nbsp;Dachgeschoss</BereichLabel
<Bereich
bereich="B"
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 -->
<BereichLabel bereich="C"
>Eingabe von 3&nbsp;zusammenhängenden Verbrauchsjahren</BereichLabel
>
<div class="collapseBereich">
<Verbrauch
<Bereich
bereich="C"
title="Eingabe von 3 zusammenhängenden Verbrauchsjahren"
><Verbrauch
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:ausweis
/>
</div>
/></Bereich
>
<!-- D Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen -->
<BereichLabel bereich="D"
>Eingabe&nbsp;Warmwasseranteil
und&nbsp;Verwendung&nbsp;von&nbsp;alternativen
Energieversorgungssystemen</BereichLabel
<Bereich
bereich="D"
title="Eingabe Warmwasseranteil und Verwendung von alternativen Energieversorgungssystemen"
><Warmwasseranteil bind:ausweis /></Bereich
>
<div class="collapseBereich">
<Warmwasseranteil bind:ausweis />
</div>
<!-- E Eingabe von Gebäudeteil, Lüftung, Kühlung und Leerstand -->
<BereichLabel bereich="E"
>Eingabe&nbsp;von&nbsp;Gebäudeteil,
Lüftung,&nbsp;Kühlung&nbsp;und&nbsp;Leerstand</BereichLabel
<Bereich
bereich="E"
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 -->
<BereichLabel bereich="F"
>Angaben zur Heizunganlage</BereichLabel
>
<div class="collapseBereich">
<SanierungszustandHeizungsanlage
<Bereich bereich="F" title="Angaben zur Heizunganlage"
><SanierungszustandHeizungsanlage
bind:images
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:ausweis
/>
</div>
/></Bereich
>
<!-- G Angaben zur Fenster, Dachfenster und Türen -->
<BereichLabel bereich="G"
>Angaben zu Fenster, Dachfenster und Türen</BereichLabel
>
<div class="collapseBereich">
<SanierungszustandFensterTueren
<Bereich bereich="G" title="Angaben zu Fenster, Dachfenster und Türen"
><SanierungszustandFensterTueren
bind:images
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:ausweis
/>
</div>
/></Bereich
>
<!-- H Angaben zur Wärmedammung -->
<BereichLabel bereich="H"
>Angaben zur Wärmedämmung</BereichLabel
>
<div class="collapseBereich">
<SanierungszustandWaermedammung
<Bereich bereich="H" title="Angaben zur Wärmedämmung"
><SanierungszustandWaermedammung
bind:images
bind:gebaeude
bind:gebaeude_aufnahme_allgemein
bind:ausweis
/>
</div>
/></Bereich
>
<!-- I Gebäudebild und Energieausweis PDF Vorschau -->
<BereichLabel bereich="I"
>Gebäudebild und Energieausweis PDF Vorschau</BereichLabel
>
<div class="collapseBereich">
<AusweisPreviewContainer
<Bereich bereich="I" title="Gebäudebild und Energieausweis PDF Vorschau"
><AusweisPreviewContainer
bind:images
bind:ausweis
bind:gebaeude />
</div>
bind:gebaeude
/></Bereich
>
</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
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">
<AusweisWeiter bind:ausweis bind:images bind:user bind:gebaeude bind:gebaeude_aufnahme_allgemein></AusweisWeiter>
</div>
<div class="md:justify-self-end"><Hilfe />
</div>
</div>
<div class="md:justify-self-end"><Hilfe /></div>
</div>
</form>
<RawNotificationWrapper>
@@ -355,6 +331,35 @@ xs:grid-cols-2"
</RawNotification>
{/if}
{#if gebaeude_aufnahme_allgemein.nutzflaeche && gebaeude_aufnahme_allgemein.flaeche && gebaeude_aufnahme_allgemein.flaeche === gebaeude_aufnahme_allgemein.nutzflaeche}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
timeout: 0,
uid: "WOHNFLAECHE_GLEICH_GESAMTFLAECHE",
dismissable: true,
type: "warning",
}}
>
Die angegebene Gesamtfläche ist gleich der angegebenen Wohnfläche, in den meisten Fällen sollte die Gesamtfläche größer sein.
</RawNotification>
{/if}
{#if typeof gebaeude_aufnahme_allgemein.einheiten === "number" && gebaeude_aufnahme_allgemein.einheiten < 1}
<RawNotification
notification={{
message: "Plausibilitätsprüfung",
timeout: 0,
uid: "ANZAHL_EINHEITEN",
dismissable: false,
type: "warning",
selector: "input[name='einheiten']"
}}
>
Die Anzahl der Wohneinheiten muss mindestens 1 betragen.
</RawNotification>
{/if}
{#await auditPlzNichtErkannt(gebaeude_aufnahme_allgemein) then result}
{#if result}
<RawNotification
@@ -537,10 +542,12 @@ xs:grid-cols-2"
>
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(
ausweis,
gebaeude_aufnahme_allgemein,
)[0]} und {auditVerbrauchAbweichung(ausweis, gebaeude_aufnahme_allgemein)[1]} beträgt mehr
als 30% und sie haben keinen Leerstand angegeben. Sind sie sich sicher,
dass das stimmt?
gebaeude_aufnahme_allgemein
)[0]} und {auditVerbrauchAbweichung(
ausweis,
gebaeude_aufnahme_allgemein
)[1]} beträgt mehr als 30% und sie haben keinen Leerstand angegeben.
Sind sie sich sicher, dass das stimmt?
</RawNotification>
{/if}

View File

@@ -146,7 +146,7 @@ xs:grid-cols-2
</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 />

View File

@@ -1,7 +1,7 @@
---
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 { createCaller } from "#lib/caller";
@@ -31,5 +31,5 @@ if (uid) {
---
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
<BedarfsausweisContent client:load ausweis={ausweis}></BedarfsausweisContent>
<BedarfsausweisWohnenModule client:load ausweis={ausweis}></BedarfsausweisWohnenModule>
</AusweisLayout>