diff --git a/persistent/images/haken.png b/persistent/images/haken.png new file mode 100644 index 00000000..55d46662 Binary files /dev/null and b/persistent/images/haken.png differ diff --git a/public/images/dashboard/DatenblattHaken.svg b/public/images/dashboard/DatenblattHaken.svg new file mode 100644 index 00000000..46552de7 --- /dev/null +++ b/public/images/dashboard/DatenblattHaken.svg @@ -0,0 +1,40586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ENERGIEAUSWEIS + für Wohngebäude + gemäß den §§79 ff. Gebäudeenergiegesetz (GEG) vom + 1 + + 20. Juli 2022 + + + + 1 + + + Gültig bis: + + + + + + Gebäude + + + Gebäudetyp + + + Adresse + + + Gebäudeteil + + + Baujahr Gebäude + 3 + + + Baujahr Wärmeerzeuger + 3, 4 + + + Anzahl Wohnungen + + + + nach §82 GEG aus der Wohnfläche ermittelt + + Gebäudenutzfläche (A + N + ) + + + Wesentliche Energieträger fürHeizung und Warmwasser + 3 + + Art: + + Verwendung: + + Erneuerbare Energien + + + + + Art der Lüftung / Kühlung + + Fensterlüftung + + Schachtlüftung + + Lüftungsanlage mit Wärmerückgewinnung + + Lüftungsanlage ohne Wärmerückgewinnung + + + Anlass der Ausstellungdes Energieausweises + + Neubau + + Vermietung / Verkauf + + Modernisierung(Änderung / Erweiterung) + + Sonstiges(freiwillig) + + + HinweisezudenAngabenüberdieenergetischeQualitätdesGebäudes + Die energetische Qualität eines Gebäudes kann durch die Berechnung des Energiebedarfs unter Annahme von standardisiertenRandbedingungen oder durch die Auswertung des Energieverbrauchs ermittelt werden. Als Bezugsfläche dient die energetischeGebäudenutzfläche nach dem GEG, die sich in der Regel von den allgemeinen Wohnflächenangaben unterscheidet. Die an-gegebenen Vergleichswerte sollen überschlägige Vergleiche ermöglichen (Erläuterungen - siehe Seite 5). Teil des Energie-ausweises sind die Modernisierungsempfehlungen (Seite 4). + + DerEnergieausweiswurdeaufderGrundlagevonBerechnungendesEnergiebedarfserstellt(Energie-bedarfsausweis).DieErgebnissesindaufSeite2dargestellt.ZusätzlicheInformationenzumVerbrauchsindfreiwillig. + + DerEnergieausweiswurdeaufderGrundlagevonAuswertungendesEnergieverbrauchserstellt(Energie-verbrauchsausweis). Die Ergebnisse sind auf Seite 3dargestellt.Datenerhebung Bedarf/Verbrauch durch + + Eigentümer + + Aussteller + + Dem Energieausweis sind zusätzliche Informationen zurenergetischen Qualität beigefügt (freiwillige Angabe). + + + + Hinweise zur Verwendung des Energieausweises + DerEnergieausweisdientlediglichderInformation.DieAngabenimEnergieausweisbeziehensichaufdasgesamteWohngebäudeoderdenobenbezeichnetenGebäudeteil.DerEnergieausweisistlediglichdafürgedacht,einen überschlägigen Vergleich von Gebäuden zu ermöglichen. + + + + + Aussteller: + + + + + + + + + Ausstellungsdatum + + Unterschrift des Ausstellers + 1 + Datum des angewendeten GEG, gegebenenfalls des angewendeten Änderungsgesetzes zum GEG + 2 + nur im Fall des §79 Absatz 2 Satz 2 GEG einzutragen + 3 + Mehrfachangaben möglich + 4 + bei Wärmenetzen Baujahr der Übergabestation + 5 + Klimaanlagen oder kombinierte Lüftungs- und Klimaanlagen im Sinne des §74 GEG + + Anzahl: + + Nächstes Fälligkeitsdatum der Inspektion: + + Inspektionspf. Klimaanlagen + 5 + + + + Passive Kühlung + + + Gelieferte Kälte + + + Kühlung aus Strom + + Kühlung aus Wärme + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/dashboard/DatenblattKreuz.svg b/public/images/dashboard/DatenblattKreuz.svg new file mode 100644 index 00000000..5d5f57d8 --- /dev/null +++ b/public/images/dashboard/DatenblattKreuz.svg @@ -0,0 +1,40596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Datenblatt + diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 78e89147..655349ed 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -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"), diff --git a/src/components/Dashboard/DashboardAusweis.svelte b/src/components/Dashboard/DashboardAusweis.svelte index 34a1db32..1ead9a40 100644 --- a/src/components/Dashboard/DashboardAusweis.svelte +++ b/src/components/Dashboard/DashboardAusweis.svelte @@ -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 @@
+ {#if ausweis.ausgestellt} + Ausgestellt + {:else if ausweis.bestellt} + Bestellt + {:else} + {#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe} + Angefordert + {:else} + Gespeichert + {/if} + {/if}
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen} Verbrauchsausweis Wohnen @@ -232,27 +249,15 @@ {:else if ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe} Bedarfsausweis Gewerbe {/if} - - {#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL} - (Beratung) - {:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL} - (Offline) - {/if}
- - {#if ausweis.ausgestellt} - Ausgestellt - {:else if ausweis.bestellt} - Bestellt - {:else} - {#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe} - Gespeichert - {:else} - Angefordert - {/if} - {/if}
-
{objekt.adresse}
+
+ {#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL} + mit Beratung + {:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL} + Offline + {/if} +
@@ -261,17 +266,16 @@ >{progress}%
- {#if ausweis.bestellt} - {#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL} -

Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden innerhalb der nächsten 48 Stunden über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.

- {:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL} -

Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen Ihres Energieversorgers.

- {:else if !ausweis.ausgestellt} -

Der Ausweis wurde von Ihnen freigegeben und befindet sich in Prüfung vom IB Cornelsen

- {/if} - {/if} {#await calculations then calculations} -
+
+
+ Erstellungsdatum + {moment(aufnahme.erstellungsdatum).format( + "DD.MM.YYYY" + )} +
Energieverbrauch {calculations?.co2EmissionenGesamt}Kg/A
-
- Erstellungsdatum - {moment(aufnahme.erstellungsdatum).format( - "DD.MM.YYYY" - )} -
Baujahr
-
- ID - {id} -
{/await} -
- {#if !ausweis.storniert && !ausweis.ausgestellt} + +
+ + {#if ausweis.ausgestellt} + Energieausweis + {:else} + Energieausweis + {/if} + + + {#if ausweis.ausgestellt} + Energieausweis + {:else} + Energieausweis + {/if} + + +
+ {#if !ausweis.storniert && !ausweis.ausgestellt} + Telefon {benutzer.telefon} +
+
+

+ + + {#if benutzer.rolle === "ADMIN"}
  • @@ -86,30 +191,8 @@
  • {/if}
    -
    -
    - - - + -
    -
    - - -
    - {#each aufnahme.verbrauchsausweise_wohnen as ausweis} - - {/each} - {#each aufnahme.bedarfsausweise_wohnen as ausweis} - - {/each} - {#each aufnahme.verbrauchsausweise_gewerbe as ausweis} - - {/each} - {#each aufnahme.geg_nachweise_wohnen as nachweis} - - {/each} - {#each aufnahme.geg_nachweise_gewerbe as nachweis} - - {/each} - {#each aufnahme.bedarfsausweise_gewerbe as nachweis} - - {/each} -
    - -
    - -
    \ No newline at end of file + \ No newline at end of file diff --git a/src/modules/Dashboard/DashboardEinstellungenModule.svelte b/src/modules/Dashboard/DashboardEinstellungenModule.svelte index 9da98aa8..56449bc7 100644 --- a/src/modules/Dashboard/DashboardEinstellungenModule.svelte +++ b/src/modules/Dashboard/DashboardEinstellungenModule.svelte @@ -71,36 +71,6 @@ Profil - - - Ausweise - - - - Kontakt - -
  • -
    - - - Services -
      -
    • - - - Kontakt - -
    • -
    • - - - Kontakt - -
    • -
    -
    -
  • \ No newline at end of file diff --git a/src/pages/dashboard/objekte/[page].astro b/src/pages/dashboard/objekte/[page].astro index 976516c6..a376ab08 100644 --- a/src/pages/dashboard/objekte/[page].astro +++ b/src/pages/dashboard/objekte/[page].astro @@ -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 ? { - benutzer: { - 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" - }, - include: { - aufnahmen: { - 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 +const totalPageCount = await prisma.aufnahme.count({ + where: + user.rolle === Enums.BenutzerRolle.USER + ? { + benutzer: { + id: user.id, + }, } - } - }, - take: 25, - skip: (page - 1) * 25 - }) + : {}, +}); + +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: { + rechnung: true, + aufnahme: { + include: { + bilder: true, + unterlagen: true, + objekt: true, + }, + }, + }, + }); + } 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 + if (id) { + const adapter = getPrismaAusweisAdapter(id); + ausweis = await adapter?.findUnique({ + where: { + id, }, - } : { - OR: [ - { - aufnahmen: { - every: { - verbrauchsausweise_gewerbe: { - some: { - ausgestellt: false, - bestellt: true - } - }, - } - } + include: { + rechnung: true, + aufnahme: { + include: { + bilder: true, + unterlagen: true, + objekt: true, + }, }, - { - aufnahmen: { - every: { - verbrauchsausweise_wohnen: { - some: { - ausgestellt: false, - bestellt: true - } - }, - } - } - }, - { - aufnahmen: { - every: { - bedarfsausweise_wohnen: { - some: { - ausgestellt: false, - bestellt: true - } - }, - } - } - }] - }, - orderBy: { - erstellungsdatum: "desc" + }, + }); + } 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: { - 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 - }) + }); } +if (!ausweis) { + return Astro.redirect("/dashboard/objekte/1") +} --- - - \ No newline at end of file + + + + diff --git a/src/pages/pdf/datenblatt.ts b/src/pages/pdf/datenblatt.ts index 957f48e0..02526935 100644 --- a/src/pages/pdf/datenblatt.ts +++ b/src/pages/pdf/datenblatt.ts @@ -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;