Merge pull request #516 from IBCornelsen/dashboard

Neues Dashboard
This commit is contained in:
Jens Cornelsen
2025-04-22 01:10:38 +02:00
committed by GitHub
17 changed files with 81795 additions and 408 deletions

BIN
persistent/images/haken.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 MiB

View File

@@ -12,12 +12,12 @@ export const createCaller = createCallerFactory({
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
"admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
"bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[id]": await import("../src/pages/api/bilder/[id].ts"),

View File

@@ -21,9 +21,15 @@
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeKomplettClient;
export let rechnung: RechnungClient;
export let rechnung: RechnungClient | null;
export let objekt: Objekt;
export let benutzer: BenutzerClient;
import { FileText } from "radix-svelte-icons";
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
import DashboardNotification from "./DashboardNotification.svelte";
import { notifications } from "#components/NotificationProvider/shared.js";
import { Bell } from "radix-svelte-icons";
import { A13BerechnungRechnerischeLaufzeitHeizung } from "#lib/Berechnungen/BedarfsausweisWohnen/A13BerechnungRechnerischeLaufzeitHeizung.js";
const progress = ausweis.ausgestellt ? 100 : ausweis.bestellt ? 66 : 33;
const ausweisart = getAusweisartFromId(ausweis.id);
@@ -218,6 +224,17 @@
</ul>
</div>
<div class="flex flex-row flex-wrap items-center gap-2">
{#if ausweis.ausgestellt}
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
{:else if ausweis.bestellt}
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
{:else}
{#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Angefordert</span>
{:else}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
{/if}
{/if}
<div class="text-lg font-semibold">
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
Verbrauchsausweis Wohnen
@@ -232,27 +249,15 @@
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
Bedarfsausweis Gewerbe
{/if}
</div>
</div>
<div class="badge badge-accent font-semibold text-black text-m">
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
(Beratung)
mit Beratung
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
(Offline)
Offline
{/if}
</div>
{#if ausweis.ausgestellt}
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
{:else if ausweis.bestellt}
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
{:else}
{#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
{:else}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Angefordert</span>
{/if}
{/if}
</div>
<div class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div>
<div class="mb-4 flex flex-row items-center gap-4">
<div class="w-full border rounded-lg my-2">
<div class="bg-green-600 h-4 rounded-lg" class:bg-red-600={progress == 33} class:bg-primary={progress == 66} style="width: {progress}%;"></div>
@@ -261,17 +266,16 @@
>{progress}%</span
>
</div>
{#if ausweis.bestellt}
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
<p class="text-sm font-semibold">Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden innerhalb der nächsten 48 Stunden über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.</p>
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
<p class="text-sm font-semibold">Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen Ihres Energieversorgers.</p>
{:else if !ausweis.ausgestellt}
<p class="text-sm font-semibold">Der Ausweis wurde von Ihnen freigegeben und befindet sich in Prüfung vom IB Cornelsen</p>
{/if}
{/if}
{#await calculations then calculations}
<div class="flex flex-col gap-2">
<div class="flex flex-col mb-4">
<div class="flex flex-row justify-between">
<span>Erstellungsdatum</span>
<span class="font-bold text-base-content"
>{moment(aufnahme.erstellungsdatum).format(
"DD.MM.YYYY"
)}</span
>
</div>
<div class="flex flex-row justify-between">
<span>Energieverbrauch</span>
<span class="font-bold text-base-content"
@@ -284,14 +288,6 @@
>{calculations?.co2EmissionenGesamt}Kg/A</span
>
</div>
<div class="flex flex-row justify-between">
<span>Erstellungsdatum</span>
<span class="font-bold text-base-content"
>{moment(aufnahme.erstellungsdatum).format(
"DD.MM.YYYY"
)}</span
>
</div>
<div class="flex flex-row justify-between">
<span>Baujahr</span>
<span
@@ -309,16 +305,37 @@
: "N/A"}</span
>
</div>
<div class="flex flex-row justify-between">
<span>ID</span>
<span class="font-bold text-base-content"
>{id}</span
>
</div>
</div>
{/await}
<div class="flex flex-row justify-end items-center gap-4 mt-4">
<div class="flex flex-row justify-start items-center mb-4">
<a
class="p-1 rounded-lg hover:bg-gray-200 mr-2 border-2 border-gray-300"
title="PDF Herunterladen"
target="_blank"
href="/pdf/ansichtsausweis?id={ausweis.id}"
>
{#if ausweis.ausgestellt}
<img src="../../images/dashboard/AusweisHaken.svg" width="65" alt="Energieausweis">
{:else}
<img src="../../images/dashboard/AusweisKreuz.svg" width="65" alt="Energieausweis">
{/if}
</a>
<a
class="p-1 rounded-lg hover:bg-gray-200 border-2 border-gray-300"
title="PDF Herunterladen"
target="_blank"
href="/pdf/datenblatt?id={ausweis.id}"
>
{#if ausweis.ausgestellt}
<img src="../../images/dashboard/DatenblattHaken.svg" width="65" alt="Energieausweis">
{:else}
<img src="../../images/dashboard/DatenblattKreuz.svg" width="65" alt="Energieausweis">
{/if}
</a>
<div class="flex flex-col gap-2 justify-end items-center ml-4">
{#if !ausweis.storniert && !ausweis.ausgestellt}
<!--
<a
@@ -392,25 +409,238 @@
<button class="button text-sm" title="Stornieren" on:click={stornieren}>S</button>
<button class="button text-sm" title="Registriernummer anfordern" on:click={registriernummer}>R</button>
{/if}
<a
class="p-2 rounded-lg hover:bg-gray-200"
title="PDF Herunterladen"
target="_blank"
href="/pdf/ansichtsausweis?id={ausweis.id}"
>
<img src="/images/ausweis.webp" width="32" alt="Energieausweis">
</a>
<a
class="p-2 rounded-lg hover:bg-gray-200"
title="PDF Herunterladen"
target="_blank"
href="/pdf/datenblatt?id={ausweis.id}"
>
<img src="/images/datenblatt.webp" width="32" alt="Datenblatt">
</a>
</div>
</div>
<div class="mt-8">
{#if ausweis.bestellt}
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
<p class="text-sm">Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden <span class="font-bold">innerhalb der nächsten 48 Stunden</span> über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.</p>
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
<p class="text-sm">Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte <span class="font-bold">übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen</span> Ihres Energieversorgers.</p>
{:else if !ausweis.ausgestellt}
<p class="text-sm">Der Ausweis wurde von Ihnen freigegeben und befindet sich <span class="font-bold">in Prüfung durch IB Cornelsen</span></p>
{/if}
{/if}
</div>
</div>
</div>
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mr-4">
<div class="card-body">
<div class="flex flex-row flex-wrap items-center gap-2">
<div class="text-lg font-semibold">{aufnahme.gebaeudetyp}
{#if (aufnahme.einheiten > 0 && aufnahme.einheiten !== null)}
mit {aufnahme.einheiten} Wohneinheiten
{/if}
</div>
<div class="text-sm">
<span class="font-bold">Gebäude (Bj {aufnahme.baujahr_gebaeude})</span> mit
{#if aufnahme.flaeche > 0 && aufnahme.flaeche !== null}
{aufnahme.flaeche} m² Wohnfläche
sowie
{/if}
{aufnahme.nutzflaeche} m² energetische Nutzfläche. Als Ausstellgrund wurde {ausweis.ausstellgrund} angegeben.
{aufnahme.gebaeudeteil === "Wohnen"
? "Die eingegebenen Daten beziehen sich auf den Wohnteil eines gemischt genutzten Gebäudes."
: "Die eingegebenen Daten beziehen sich auf das gesamte Gebäude."}
{aufnahme.saniert ? "Das Gebäude ist in unsaniertem Zustand." : "Das Gebäude ist in saniertem Zustand."}
</div>
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
<div class="text-sm">
<span class="font-bold">Gebäudestrom</span> der Jahre vom
{moment(ausweis.startdatum).format("MM.YYYY")} bis {moment(ausweis.startdatum).add("3", "years").format("MM.YYYY")} beträgt
{ausweis.strom_1} kWh, {ausweis.strom_2} kWh und {ausweis.strom_3} kWh.
Im Stromverbrauch enthalten sind
{ausweis.stromverbrauch_enthealt_heizung ? "Heizung, " : ""}
{ausweis.stromverbrauch_enthaelt_warmwasser ? "Warmwasser, " : ""}
{ausweis.stromverbrauch_enthaelt_lueftung ? "Lüftung, " : ""}
{ausweis.stromverbrauch_enthaelt_beleuchtung ? "Beleuchtung, " : ""}
{ausweis.stromverbrauch_enthaelt_kuehlung ? "Kühlung, " : ""}
{#if ausweis.stromverbrauch_sonstig !== null}
sowie {ausweis.stromverbrauch_enthaelt_sonstige}.
{/if}
</div>
{/if}
<div class="text-sm">
<span class="font-bold">Heizung (Bj {aufnahme.baujahr_heizung})</span> wird mit {ausweis.brennstoff_1} betrieben. Die Verbräuche vom
{moment(ausweis.startdatum).format("MM.YYYY")} bis {moment(ausweis.startdatum).add("3", "years").format("MM.YYYY")} betragen
{ausweis.verbrauch_1} {ausweis.einheit_1}, {ausweis.verbrauch_2} {ausweis.einheit_1} und {ausweis.verbrauch_3} {ausweis.einheit_1}.
{#if ausweis.zusaetzliche_heizquelle} -
Eine weitere Heizung wird mit {ausweis.brennstoff_2} betrieben mit den Verbräuchen {ausweis.verbrauch_4} {ausweis.einheit_2}, {ausweis.verbrauch_5}
{ausweis.einheit_2} und {ausweis.verbrauch_6} {ausweis.einheit_2}.
{/if}
</div>
<div class="text-sm">
{#if ausweis.anteil_warmwasser_1 !== null && ausweis.anteil_warmwasser_1 > 0}
{#if aufnahme.solarsystem_warmwasser}
Da ein Solarsystem für Warmwasser vorhanden ist,
wurde ein Warmwasseranteil von {ausweis.anteil_warmwasser_1 * 0.6}% berücksichtigt.
{:else}
Es wurde ein Warmwasseranteil von {ausweis.anteil_warmwasser_1}% berücksichtigt.
{/if}
{:else}
{#if aufnahme.solarsystem_warmwasser}
Da ein Solarsystem für Warmwasser vorhanden ist, wurde ein reduzierter Warmwasserzuschlag von 12 kWh/m²a angesetzt.
{:else}
Es wurde ein Warmwasserzuschlag von 20 kWh/m²a angesetzt.
{/if}
{/if}
{#if !ausweis.alternative_heizung && !ausweis.alternative_warmwasser && !ausweis.alternative_lueftung && !ausweis.alternative_kuehlung}
Alternative Energieversorgung wird nicht verwendet
{:else}
Alternative Energieversorgung wird verwendet für {ausweis.alternative_heizung ? "Heizung, " : ""}{ausweis.alternative_warmwasser ? "Warmwasser, " : ""}{ausweis.alternative_lueftung ? "Lüftung, " : ""}{ausweis.alternative_kuehlung ? "Kühlung, " : ""}
{/if}.
Der Leerstand beträgt {aufnahme.leerstand}%. Das Gebäude verfügt über eine
{#if aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung}
Fensterlüftung
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung}
Schachtlüftung
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung}
Lüftungsanlage mit Wärmerückgewinnung
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung}
Lüftungsanlage ohne Wärmerückgewinnung
{/if}
{#if ausweis.kuehlung_enthalten && ausweis.kuehlung_entahlten !== null}
und wird thermisch gekühlt.
{:else if aufnahme.kuehlung === "1" && aufnahme.kuhlung !== null}
und wird gekühlt.
{:else}
und wird nicht gekühlt.
{/if}
</div>
<div class="text-sm">
<span class="font-bold">Heizung: </span>
{aufnahme.zentralheizung ? "Zentral/Etagenheizung, " : ""}
{aufnahme.einzelofen ? "Einzelofen, " : ""}
{aufnahme.waermepumpe ? "Wärmepumpe, " : ""}
{aufnahme.niedertemperatur_kessel ? "Niedertemperaturkessel, " : ""}
{aufnahme.standard_kessel ? "Standardkessel, " : ""}
{aufnahme.durchlauf_erhitzer ? "Durchlauferhitzer, " : ""}
{aufnahme.solarsystem_warmwasser ? "Solarsystem für Warmwasser, " : ""}
{aufnahme.waermepumpe ? "Wärmepumpe, " : ""}
{aufnahme.brennwert_kessel ? "Brennwertkessel, " : ""}
{aufnahme.standard_kessel ? "Standardkessel, " : ""}
{aufnahme.warmwasser_rohre_gedaemmt ? "Warmwasserrohre gedämmt, " : ""}
{aufnahme.heizungsrohre_gedaemmt ? "Heizungsrohre gedämmt, " : ""}
{aufnahme.photovoltaik ? "Photovoltaik, " : ""}
{aufnahme.raum_temperatur_regler ? "Raumtemperaturregler, " : ""}
{aufnahme.zirkulation ? "Zirkulation, " : ""}
</div>
<div class="text-sm">
<span class="font-bold">Fenster: </span>
{aufnahme.isolier_verglasung ? "Fenster Isolierglas, " : ""}
{aufnahme.dreifach_verglasung ? "Dreifachverglasung, " : ""}
{aufnahme.doppel_verglasung ? "Doppelverglasung, " : ""}
{aufnahme.einfach_verglasung ? "Einfachverglasung, " : ""}
{aufnahme.fenster_dicht ? "Fenster dicht, " : ""}
{aufnahme.fenster_teilweise_undicht ? "Fenster teilweise undicht, " : ""}
{aufnahme.tueren_undicht ? "Türen undicht, " : ""}
{aufnahme.tueren_dicht ? "Türen dicht, " : ""}
{aufnahme.rolllaeden_kaesten_gedaemmt ? "Rollladenkästen gedämmt" : ""}
</div>
<div class="text-sm">
<span class="font-bold">Dämmung: </span>
{aufnahme.dachgeschoss_gedaemmt ? "Dachgeschoss gedämmt, " : ""}
{aufnahme.aussenwand_gedaemmt ? "Außenwand gedämmt, " : ""}
{aufnahme.keller_decke_gedaemmt ? "Kellerdecke gedämmt, " : ""}
{aufnahme.keller_wand_gedaemmt ? "Kellerwand gedämmt, " : ""}
{aufnahme.oberste_geschossdecke_gedaemmt ? "oberste Geschossdecke gedämmt, " : ""}
{aufnahme.oberste_geschossdecke_min_12cm_gedaemmt ? "oberste Geschossdecke min. 12cm gedämmt, " : ""}
{aufnahme.dachgeschoss_min_12cm_gedaemmt ? "Dachgeschoss min. 12cm gedämmt, " : ""}
{aufnahme.aussenwand_min_12cm_gedaemmt ? "Außenwand min. 12cm gedämmt" : ""}
</div>
<div class="text-xs space-y-1 p-2">
<span class="font-semibold">Hiermit bestätige ich {benutzer.vorname} {benutzer.name} als Besteller folgende Angaben:</span><br>
{#if ausweis.pruefpunkt_heizungsalter}
<div>Das Heizungsalter ist jünger als 3 Jahre. Es betrifft einen Heizungstausch ohne energetische Verbesserung.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_niedrig}
<div>Ich habe die Verbrauchsangaben kontrolliert. Der niedrige Energiekennwert ist korrekt.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_hoch}
<div>Ich habe die Verbrauchsangaben kontrolliert. Der hohe Energiekennwert ist korrekt.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_null}
<div>Die eingegebenen Heizverbräuche sind korrekt und alle 3 Felder wurden vollständig eingegeben.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_abweichung}
<div>Die eingegebenen Heizverbräuche sind korrekt und die Abweichung lässt sich begründen.</div>
{/if}
{#if ausweis.pruefpunkt_wohnflaeche_einheiten}
<div>Die Angabe der Wohnfläche ist korrekt und bezieht sich auf das gesamte Gebäude.</div>
{/if}
{#if ausweis.pruefpunkt_strom_null}
<div>Die eingegebenen Stromverbräuche sind korrekt. Alle 3 Felder wurden vollständig eingegeben.</div>
{/if}
{#if ausweis.pruefpunkt_strom_abweichung}
<div>Die eingegebenen Stromverbräuche sind korrekt und die Abweichung lässt sich begründen.</div>
{/if}
{#if ausweis.pruefpunkt_heizungsanlage}
<div>Das Baujahr der Heizungsanlage ist kleiner als das Baujahr des Gebäudes und begründet.</div>
{/if}
{#if ausweis.pruefpunkt_anteil_warmwasser}
<div>Ich habe den Warmwasseranteil nochmal überprüft. Dieser ist korrekt und begründet.</div>
{/if}
{#if ausweis.pruefpunkt_wohnflaeche}
<div>Ich habe die Wohnfläche nochmal überprüft und bestätige die Richtigkeit. Es handelt sich lediglich um die Wohnfläche innerhalb des Gebäudes.</div>
{/if}
<div>Ich habe die AGB und DSGVO im <a href="/impressum#agb" target="_blank" rel="noopener noreferrer">Impressum</a> gelesen und akzeptiert. Ich bestätige die Richtigkeit der Eingabe.</div>
</div>
</div>
</div>
</div>
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4">
<div class="card-body">
<div class="flex flex-row flex-wrap items-center gap-2">
<div class="text-sm">
<span class="font-bold">Rechnungsadresse</span><br>
{rechnung?.empfaenger},
{#if rechnung?.zusatzzeile !== null}
{rechnung?.zusatzzeile},
{/if}
{rechnung?.strasse}, {rechnung?.plz} {rechnung?.ort}
</div>
<div class="text-sm mb-2">
<span class="font-bold">Versandadresse</span><br>
{rechnung?.versand_empfaenger},
{#if rechnung?.versand_zusatzzeile !== null}
{rechnung?.versand_zusatzzeile},
{/if}
{rechnung?.versand_strasse}, {rechnung?.versand_plz} {rechnung?.versand_ort}
</div>
<div class="text-lg font-semibold">Unterlagen</div>
<div class="text-sm">
<a href="" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 rounded-lg p-1"><FileText size={24}></FileText>Grundrissplan_O....pdf</a>
<a href="" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 rounded-lg p-1"><FileText size={24}></FileText>Grundrissplan_OG....pdf</a>
<a href="" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 rounded-lg p-1"><FileText size={24}></FileText>Grundrissplan_OG....pdf</a>
</div>
</div>
<div class="dropdown dropdown-top items-end absolute bottom-4 right-4 z-50">
<div class="indicator">
{#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="hover:bg-gray-200 p-3 rounded-lg"
>
<Bell size={24} />
</button>
</div>
<ul
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
>
<NotificationProvider component={DashboardNotification} />
</ul>
</div>
</div>
</div>
<dialog bind:this={hilfeModal} class="modal">
@@ -450,3 +680,10 @@
</div>
</div>
</dialog>
<style lang="postcss">
*{@apply font-sans
}
</style>

View File

@@ -44,14 +44,119 @@
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
<a class="button-tab" href="/dashboard">
<Reader width={22} height={22} />
Vorgänge
</a>
<a class="button-tab" href="/dashboard">
<Reader width={22} height={22} />
Inbox
Ausweise
</a>
<hr class="border-gray-600" />
Besteller
<div class="flex flex-row mb-4">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
MIchael Makler
</div>
<div class="text-xs text-gray-500">
Eigentümer oder im Auftrag
</div>
<div class="text-xs text-gray-500">
<!-- Soll für den Aussteller sichtbar sein -->
Telefon {benutzer.telefon}
</div>
</div>
</div>
<hr class="border-gray-600" />
<!--
Mitwirkende
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Ernie Energieberater
</div>
<div class="text-xs text-gray-500">
Energieberater
</div>
</div>
</div>
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Peter Planer
</div>
<div class="text-xs text-gray-500">
Architekt
</div>
</div>
</div>
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Hans Meier
</div>
<div class="text-xs text-gray-500">
Eigentümer
</div>
</div>
</div>
<hr class="border-gray-600" />
Experten in der Nähe
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Thorsten Maas
</div>
<div class="text-xs text-gray-500">
Energieberater
</div>
</div>
</div>
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Herbert Holm
</div>
<div class="text-xs text-gray-500">
Gutachter
</div>
</div>
</div>
<hr class="border-gray-600" />
<div class="flex justify-end mt-2 mb-2">
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center">
Einladen
</button>
</div>
-->
{#if benutzer.rolle === "ADMIN"}
<li>
<details class="[&_.caret]:open:rotate-180" open>
@@ -86,30 +191,8 @@
</li>
{/if}
</div>
<div class="mt-10 flex flex-col gap-4 px-8">
<div class="flex flex-row justify-between items-center">
<ThemeController bind:lightTheme></ThemeController>
<div class="dropdown dropdown-top">
<div class="indicator">
{#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="hover:bg-gray-200 p-3 rounded-lg"
>
<Bell size={24} />
</button>
</div>
<ul
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
>
<NotificationProvider component={DashboardNotification} />
</ul>
</div>
<div class="items-end bottom-4 right-4 z-50 mt-4">
<div class="flex flex-row justify-end items-end">
<a
href="/dashboard/einstellungen"
class="hover:bg-gray-200 p-3 rounded-lg"
@@ -118,12 +201,6 @@
</a>
</div>
</div>
<div class="divider px-8"></div>
<a
href="/dashboard/einstellungen"
class="hover:bg-gray-200 no-animation focus:shadow-none justify-start py-4 h-auto px-8 rounded-none w-full flex flex-row gap-4"
>
</a>
</aside>
<style>

View File

@@ -1,10 +1,11 @@
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
import { Enums, prisma, Rechnung } from "#lib/server/prisma.js";
/**
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
* @param id Die Ausweis UID

View File

@@ -169,19 +169,19 @@
<!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen -->
<!-- <Bereich
<Bereich
bereich="C"
title="Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen"
><GebaeudeVolumen bind:ausweis /></Bereich
> -->
>
<!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden -->
<!-- <Bereich
<Bereich
bereich="D"
title="Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden"
><Fensterflaechen bind:ausweis /></Bereich
> -->
>
<!-- E - Angabe zu Lüftung und Kühlung -->
@@ -198,7 +198,7 @@
bind:ausweis
{ausweisart}
/></Bereich
> -->
>
<Bereich bereich="D" title="Gebäudepläne & Unterlagen">
<div

View File

@@ -1,18 +1,24 @@
<script lang="ts">
import { AufnahmeKomplettClient, BenutzerClient } from "#components/Ausweis/types.js";
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
import Carousel from "#components/Carousel.svelte";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte";
import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
import { Objekt } from "#lib/client/prisma.js";
import { Aufnahme, BedarfsausweisWohnen, Bild, Objekt, Rechnung, Unterlage, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
import mime from "mime"
import { ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
import { CaretRight, ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
import CaretLeft from "radix-svelte-icons/src/lib/icons/CaretLeft.svelte";
export let user: BenutzerClient;
export let aufnahme: AufnahmeKomplettClient;
export let objekt: Objekt;
export let ausweis: (VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen) & {
rechnung: Rechnung,
aufnahme: Aufnahme & {
bilder: Bild[],
unterlagen: Unterlage[],
objekt: Objekt
}
};
export let benutzer: BenutzerClient;
export let page: number;
export let totalPageCount: number;
let dropdownOpen = false;
@@ -22,42 +28,46 @@
}
</script>
<h1>{objekt.adresse}, {objekt.plz} {objekt.ort}</h1>
<hr>
<div class="relative mb-6">
<div class="justify-between items-center flex flex-row">
<div class="text-2xl rounded-lg gap-2 bg-grey-200 text-center">
ID: {ausweis.id}
</div>
<div class="text-2xl">{ausweis.aufnahme.objekt.adresse}, {ausweis.aufnahme.objekt.plz} {ausweis.aufnahme.objekt.ort}</div>
<div class="relative">
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center" on:click={toggleDropdown}>
Ausweis erstellen +
</button>
{#if dropdownOpen}
<div class="absolut mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
<div class="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Wohnen Erstellen</a>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Gewerbe Erstellen</a>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis Erstellen</a>
<div class="absolute top-15 left-0 mt-2 w-50 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 z-[9999]" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
<div class="py-1 w-full" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?aufnahme={ausweis.aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Wohnen Erstellen</a>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?aufnahme={ausweis.aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Gewerbe Erstellen</a>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?aufnahme={ausweis.aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis<br>Wohnen Erstellen</a>
</div>
</div>
{/if}
</div>
</div>
<hr>
<div class="my-4 grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1 gap-2">
<div class="relative bg-gray-100 rounded-md flex justify-center items-center">
{#if aufnahme.bilder.length > 0}
<Carousel perPage={3}>
{#each aufnahme.bilder as bild, i (i)}
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[25vh] h-full w-full object-contain">
{#if ausweis.aufnahme.bilder.length > 0}
<Carousel perPage={4}>
{#each ausweis.aufnahme.bilder as bild, i (i)}
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[15vh] h-full w-full object-contain">
{/each}
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
</Carousel>
{/if}
</div>
{#if aufnahme.unterlagen.length > 0}
{#if ausweis.aufnahme.unterlagen.length > 0}
<h3 class="font-semibold">Unterlagen</h3>
<div class="grid grid-flow-col gap-4">
{#each aufnahme.unterlagen as unterlage}
{#each ausweis.aufnahme.unterlagen as unterlage}
<a href="/unterlagen/{unterlage.id}.{mime.getExtension(unterlage.mime)}" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 p-2 rounded-lg"><FileText size={32}></FileText> {unterlage.name}</a>
{/each}
</div>
@@ -65,7 +75,34 @@
</div>
<div class="my-4 grid grid-cols-[1fr] md:grid-cols-[7fr,16fr,5fr] lg:grid-cols-[7fr,16fr,5fr] min-h-[600px]">
<DashboardAusweis {benutzer} {ausweis} aufnahme={ausweis.aufnahme} objekt={ausweis.aufnahme.objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
</div>
<div class="flex items-center justify-between">
{#if page > 1}
<a class="p-2 rounded-lg hover:bg-gray-200 cursor-pointer" href="/dashboard/objekte/{page - 1}">
<CaretLeft size={30}></CaretLeft>
</a>
{:else}
<div></div>
{/if}
<div class="text-lg">Ausweis {page} / {totalPageCount}</div>
{#if totalPageCount > page}
<a class="p-2 rounded-lg hover:bg-gray-200 cursor-pointer" href="/dashboard/objekte/{page + 1}">
<CaretRight size={30}></CaretRight>
</a>
{:else}
<div></div>
{/if}
</div>
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
<NotificationWrapper></NotificationWrapper>
</div>
<style>
/* TODO: Das kann auch als Tailwind Klasse gemacht werden */
.button {
padding: 0.5rem 1rem;
font-size: 1rem;
@@ -73,28 +110,3 @@
cursor: pointer;
}
</style>
<div class="my-4 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
{#each aufnahme.verbrauchsausweise_wohnen as ausweis}
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.bedarfsausweise_wohnen as ausweis}
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.verbrauchsausweise_gewerbe as ausweis}
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.geg_nachweise_wohnen as nachweis}
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.geg_nachweise_gewerbe as nachweis}
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.bedarfsausweise_gewerbe as nachweis}
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
{/each}
</div>
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
<NotificationWrapper></NotificationWrapper>
</div>

View File

@@ -71,36 +71,6 @@
<Person size={22} />
Profil
</Tab>
<Tab>
<Reader width={22} height={22} />
Ausweise
</Tab>
<Tab>
<EnvelopeClosed width={22} height={22} />
Kontakt
</Tab>
<li>
<details>
<summary class="tab w-full outline-0 hover:outline-0">
<Cube width={22} height={22} />
Services</summary
>
<ul>
<li>
<Tab>
<EnvelopeClosed width={22} height={22} />
Kontakt
</Tab>
</li>
<li>
<Tab>
<EnvelopeClosed width={22} height={22} />
Kontakt
</Tab>
</li>
</ul>
</details>
</li>
</TabList>
<div
class="border border-base-300 w-full h-full rounded-lg bg-base-200 p-8"

View File

@@ -15,6 +15,7 @@
import Pagination from "#components/Pagination.svelte";
import { Enums, Objekt } from "#lib/client/prisma.js";
export let user: BenutzerClient;
export let objekte: ObjektKomplettClient[];
export let page: number;

View File

@@ -7,6 +7,7 @@ import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { TokenType } from "#lib/auth/types.js";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
export const GET = defineApiRoute({
meta: {
description:

View File

@@ -39,31 +39,49 @@ const aufnahme = await prisma.aufnahme.findUnique({
bilder: true,
unterlagen: true,
bedarfsausweise_wohnen: {
orderBy: {
updated_at: "desc"
},
include: {
rechnung: true
}
},
verbrauchsausweise_gewerbe: {
orderBy: {
updated_at: "desc"
},
include: {
rechnung: true
}
},
verbrauchsausweise_wohnen: {
orderBy: {
updated_at: "desc"
},
include: {
rechnung: true
}
},
bedarfsausweise_gewerbe: {
orderBy: {
updated_at: "desc"
},
include: {
rechnung: true
}
},
geg_nachweise_gewerbe: {
orderBy: {
updated_at: "desc"
},
include: {
rechnung: true
}
},
geg_nachweise_wohnen: {
orderBy: {
updated_at: "desc"
},
include: {
rechnung: true
}

View File

@@ -1,80 +0,0 @@
---
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { prisma, Enums } from "#lib/server/prisma";
import { createCaller } from "src/astro-typesafe-api-caller";
const caller = createCaller(Astro)
const id = Astro.url.searchParams.get("id");
if (!id) {
return Astro.redirect("/dashboard/objekte")
}
const user = await caller.user.self.GET.fetch(undefined, {
headers: {
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
if (!user) {
return Astro.redirect("/auth/login")
}
const objekte = await prisma.objekt.findFirst({
where: user.rolle === Enums.BenutzerRolle.USER ? {
benutzer: {
id: user.id
},
} : {
...(id ? {OR: [
{
aufnahmen: {
every: {
verbrauchsausweise_gewerbe: {
some: {
id
}
},
}
}
},
{
aufnahmen: {
every: {
verbrauchsausweise_wohnen: {
some: {
id
}
},
}
}
},
{
aufnahmen: {
every: {
bedarfsausweise_wohnen: {
some: {
id
}
},
}
}
},]} : {})
},
orderBy: {
erstellungsdatum: "desc"
},
include: {
aufnahmen: {
include: {
bilder: true,
unterlagen: true,
bedarfsausweise_wohnen: true,
verbrauchsausweise_gewerbe: true,
verbrauchsausweise_wohnen: true
}
}
}
})
---

View File

@@ -2,4 +2,5 @@
return Astro.redirect("/dashboard/objekte/1", 301);
---
<script></script>

View File

@@ -1,168 +1,134 @@
---
import UserLayout from "#layouts/DashboardLayout.astro";
import { Enums, prisma } from "#lib/server/prisma";
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
import { getCurrentUser } from "#lib/server/user";
import DashboardAufnahmeModule from "#modules/Dashboard/DashboardAufnahmeModule.svelte";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
const params = Astro.params;
const page = Number(params.page)
const page = Number(params.page);
const id = Astro.url.searchParams.get("id") || undefined;
const user = await getCurrentUser(Astro)
const user = await getCurrentUser(Astro);
if (!user) {
return Astro.redirect("/auth/login")
return Astro.redirect("/auth/login");
}
const totalPages = await prisma.objekt.count({
where: user.rolle === Enums.BenutzerRolle.USER ? {
const totalPageCount = await prisma.aufnahme.count({
where:
user.rolle === Enums.BenutzerRolle.USER
? {
benutzer: {
id: user.id
id: user.id,
},
}
} : {}
})
: {},
});
let objekte = []
if (id) {
objekte = await prisma.objekt.findMany({
where: user.rolle === Enums.BenutzerRolle.USER ? {
benutzer: {
id: user.id
},
} : {
...(id ? {
OR: [
{
aufnahmen: {
every: {
verbrauchsausweise_gewerbe: {
some: {
id: {
contains: id
}
}
},
}
}
},
{
aufnahmen: {
every: {
verbrauchsausweise_wohnen: {
some: {
id: {
contains: id
}
}
},
}
}
},
{
aufnahmen: {
every: {
bedarfsausweise_wohnen: {
some: {
id: {
contains: id
}
}
},
}
}
},]} : {})
},
orderBy: {
erstellungsdatum: "desc"
if (page < 1 || page > totalPageCount) {
return Astro.redirect("/dashboard/objekte/1");
}
let ausweis,
result: { id: string; updated_at: Date }[] = [];
// Wir fragen den neuesten Ausweis ab
// Falls der Nutzer ein Admin ist dann kommt der ganz neueste ansonsten der neueste des eingeloggten Benutzers.
if (user.rolle === Enums.BenutzerRolle.USER) {
if (id) {
const adapter = getPrismaAusweisAdapter(id);
ausweis = await adapter?.findUnique({
where: {
id,
benutzer_id: user.id,
},
include: {
aufnahmen: {
rechnung: true,
aufnahme: {
include: {
bilder: true,
unterlagen: true,
bedarfsausweise_wohnen: true,
verbrauchsausweise_gewerbe: true,
verbrauchsausweise_wohnen: true,
bedarfsausweise_gewerbe: true,
geg_nachweise_gewerbe: true,
geg_nachweise_wohnen: true
}
}
objekt: true,
},
take: 25,
skip: (page - 1) * 25
})
},
},
});
} else {
result =
await prisma.$queryRaw`SELECT id, updated_at FROM "VerbrauchsausweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
SELECT id, updated_at FROM "VerbrauchsausweisGewerbe" WHERE benutzer_id = ${user.id} UNION ALL
SELECT id, updated_at FROM "BedarfsausweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
SELECT id, updated_at FROM "BedarfsausweisGewerbe" WHERE benutzer_id = ${user.id} UNION ALL
SELECT id, updated_at FROM "GEGNachweisWohnen" WHERE benutzer_id = ${user.id} UNION ALL
SELECT id, updated_at FROM "GEGNachweisGewerbe" WHERE benutzer_id = ${user.id}
ORDER BY updated_at DESC LIMIT 1 OFFSET ${page - 1}`;
}
} else {
objekte = await prisma.objekt.findMany({
where: user.rolle === Enums.BenutzerRolle.USER ? {
benutzer: {
id: user.id
},
} : {
OR: [
{
aufnahmen: {
every: {
verbrauchsausweise_gewerbe: {
some: {
ausgestellt: false,
bestellt: true
}
},
}
}
},
{
aufnahmen: {
every: {
verbrauchsausweise_wohnen: {
some: {
ausgestellt: false,
bestellt: true
}
},
}
}
},
{
aufnahmen: {
every: {
bedarfsausweise_wohnen: {
some: {
ausgestellt: false,
bestellt: true
}
},
}
}
}]
},
orderBy: {
erstellungsdatum: "desc"
if (id) {
const adapter = getPrismaAusweisAdapter(id);
ausweis = await adapter?.findUnique({
where: {
id,
},
include: {
aufnahmen: {
rechnung: true,
aufnahme: {
include: {
bilder: true,
unterlagen: true,
bedarfsausweise_wohnen: true,
verbrauchsausweise_gewerbe: true,
verbrauchsausweise_wohnen: true,
bedarfsausweise_gewerbe: true,
geg_nachweise_gewerbe: true,
geg_nachweise_wohnen: true
}
}
objekt: true,
},
take: 25,
skip: (page - 1) * 25
})
},
},
});
} else {
result =
await prisma.$queryRaw`SELECT id, updated_at FROM "VerbrauchsausweisWohnen" UNION ALL
SELECT id, updated_at FROM "VerbrauchsausweisGewerbe" UNION ALL
SELECT id, updated_at FROM "BedarfsausweisWohnen" UNION ALL
SELECT id, updated_at FROM "BedarfsausweisGewerbe" UNION ALL
SELECT id, updated_at FROM "GEGNachweisWohnen" UNION ALL
SELECT id, updated_at FROM "GEGNachweisGewerbe"
ORDER BY updated_at DESC LIMIT 1 OFFSET ${page - 1}`;
}
}
if (result.length > 0) {
const adapter = getPrismaAusweisAdapter(result[0].id);
ausweis = await adapter?.findUnique({
where: {
id: result[0].id,
},
include: {
rechnung: true,
aufnahme: {
include: {
bilder: true,
unterlagen: true,
objekt: true,
},
},
},
});
}
if (!ausweis) {
return Astro.redirect("/dashboard/objekte/1")
}
---
<UserLayout title="Objekte" {user}>
<DashboardModule {user} {objekte} totalPages={Math.ceil(totalPages / 25)} page={page} {id} client:load />
<DashboardAufnahmeModule
{ausweis}
benutzer={user}
{totalPageCount}
{page}
client:load
/>
<!-- {!aufnahme ? <p>Keine weiteren Ausweise vorhanden.</p> : <DashboardAufnahmeModule {user} {aufnahme} benutzer={user} objekt={aufnahme.objekt} client:load/>} -->
<!-- <DashboardModule {user} {objekte} totalPages={Math.ceil(totalPages / 25)} page={page} {id} client:load /> -->
</UserLayout>

View File

@@ -16,6 +16,7 @@ export const GET: APIRoute = async (Astro) => {
return new Response(null, { status: 404 });
}
const ausweisart = getAusweisartFromId(ausweis_id)
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null;