From 074ee8b463b43cf3b19142c0ace821a299ce7003 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Sat, 5 Apr 2025 22:35:08 -0300 Subject: [PATCH 1/2] Bugfixes --- src/client/tickets/createTicket.ts | 2 +- src/components/Ausweis/Ausweisart.svelte | 6 +- .../Ausweis/ButtonWeiterHilfe.svelte | 9 +- src/components/Ausweis/GebaeudeDaten.svelte | 6 +- src/components/Ausweis/GebaeudeVolumen.svelte | 813 +++++++++--------- .../Ausweis/LueftungundLeerstand.svelte | 4 +- .../SanierungszustandFensterTueren.svelte | 8 +- .../SanierungszustandHeizungsanlage.svelte | 4 +- src/components/Ausweis/StromVerbrauch.svelte | 6 +- src/components/Ausweis/Verbrauch.svelte | 8 +- .../Dashboard/DashboardObjekt.svelte | 28 +- .../BedarfsausweisWohnenModule.svelte | 107 +-- .../VerbrauchsausweisGewerbeModule.svelte | 20 +- src/pages/api/ticket/index.ts | 15 +- .../verbrauchsausweis-gewerbe/index.astro | 125 ++- 15 files changed, 559 insertions(+), 602 deletions(-) diff --git a/src/client/tickets/createTicket.ts b/src/client/tickets/createTicket.ts index a9b14b14..7f12f395 100644 --- a/src/client/tickets/createTicket.ts +++ b/src/client/tickets/createTicket.ts @@ -1,6 +1,6 @@ import { OmitKeys, TicketClient } from "#components/Ausweis/types.js"; import { api } from "astro-typesafe-api/client"; -export async function createTicket(info: OmitKeys) { +export async function createTicket(info: OmitKeys) { return await api.ticket.PUT.fetch(info) } \ No newline at end of file diff --git a/src/components/Ausweis/Ausweisart.svelte b/src/components/Ausweis/Ausweisart.svelte index 2715882c..b6eb8793 100644 --- a/src/components/Ausweis/Ausweisart.svelte +++ b/src/components/Ausweis/Ausweisart.svelte @@ -49,7 +49,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 required data-cy="ausstellgrund" > - + {#each ausstellgrund as name} {/each} @@ -73,7 +73,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 required bind:value={aufnahme.gebaeudetyp} > - + {#if ausweisart==Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen} @@ -225,7 +225,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 required bind:value={aufnahme.saniert} > - + diff --git a/src/components/Ausweis/ButtonWeiterHilfe.svelte b/src/components/Ausweis/ButtonWeiterHilfe.svelte index a1339721..ee2ee4a1 100644 --- a/src/components/Ausweis/ButtonWeiterHilfe.svelte +++ b/src/components/Ausweis/ButtonWeiterHilfe.svelte @@ -5,7 +5,7 @@ import Overlay from "#components/Overlay.svelte"; import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte"; - import { AusweisTyp, BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.js"; + import { AusweisTyp, BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage, VerbrauchsausweisWohnen } from "#lib/client/prisma.js"; import { openWindowWithPost } from "#lib/helpers/window.js"; import { PRICES } from "#lib/constants.js"; import { nachweisSpeichern } from "#client/lib/nachweisSpeichern.js"; @@ -19,6 +19,7 @@ export let ausweisart: Enums.Ausweisart export let form: HTMLFormElement; export let skala: HTMLDivElement; + export let blockLocalStorageSync: boolean = false; export let showWeiter: boolean = true; export let showHelpButton: boolean = true; @@ -95,10 +96,10 @@ let result: Awaited> | Awaited> | null = null; if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { - result = await nachweisSpeichern({ ...ausweis, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart) + result = await nachweisSpeichern({ ...ausweis as GEGNachweisWohnen, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart) ausweis.id = result.nachweis_id; } else { - result = await ausweisSpeichern({ ...ausweis, ausweistyp }, objekt, aufnahme, bilder, ausweisart) + result = await ausweisSpeichern({ ...ausweis as VerbrauchsausweisWohnen, ausweistyp }, objekt, aufnahme, bilder, ausweisart) ausweis.id = result.ausweis_id; } @@ -108,7 +109,7 @@ "", `${location.pathname}?id=${ausweis.id}` ); - + blockLocalStorageSync = true; localStorage.clear() window.location.href = `/speichern-erfolgreich?id=${ausweis.id}` } diff --git a/src/components/Ausweis/GebaeudeDaten.svelte b/src/components/Ausweis/GebaeudeDaten.svelte index 16ce8603..2f1ff4fd 100644 --- a/src/components/Ausweis/GebaeudeDaten.svelte +++ b/src/components/Ausweis/GebaeudeDaten.svelte @@ -183,7 +183,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 bind:value={aufnahme.gebaeudeteil} required > - + @@ -214,7 +214,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 bind:value={aufnahme.dachgeschoss} required > - + @@ -243,7 +243,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 required bind:value={aufnahme.keller} > - + diff --git a/src/components/Ausweis/GebaeudeVolumen.svelte b/src/components/Ausweis/GebaeudeVolumen.svelte index ee6aae01..bb20ec79 100644 --- a/src/components/Ausweis/GebaeudeVolumen.svelte +++ b/src/components/Ausweis/GebaeudeVolumen.svelte @@ -1,454 +1,475 @@ -
+" +> +
+
+
+ rechteck +
+
+ l-form +
+
+ t-form +
+
+ u-form +
+
+
-
-
-
rechteck
-
l-form
-
t-form
-
u-form
-
-
- -
- -
+
+ > +
+

+ Berechnungshilfe - Eingabe der Grundfläche, Gechossanzahl + und -höhe +

+
+ Hier wählen Sie Ihren passenden Grundriss aus, und + tragen die entsprechenden Maße unten ein. Bitte + berücksichtigen Sie nur den Grundriss der zum beheizten + Gebäude gehört. Garagen oder Schuppen die an das Haus + herangebaut sind aber keine Verbindung zum Wohnhaus + haben bitte weglassen. +
+
-
-

Berechnungshilfe - Eingabe der Grundfläche, Gechossanzahl und -höhe

-
- Hier wählen Sie Ihren passenden Grundriss aus, und tragen die entsprechenden Maße unten ein. - Bitte berücksichtigen Sie nur den Grundriss der zum beheizten Gebäude gehört. - Garagen oder Schuppen die an das Haus herangebaut sind aber keine Verbindung zum Wohnhaus haben bitte weglassen. -
-
+
+ -
- + - +
+ +
+
-
- -
-
+
+ -
- + - +
+ +
+
-
- -
-
+
+ -
- + - +
+ +
+
-
- -
-
+
+ -
- + - +
+ +
+
-
- -
+
+ -
+ -
- +
+ +
+
- +
+ -
- -
+ -
+
+ +
+
+
- -
- - - - -
- -
- -
- -
- -
+ > +
+ -
- + - +
+ Bitte geben Sie hier die Anzahl der Vollgeschosse an. + Keller und Dachgeschoss mit Schrägen zählen nicht dazu. +
+
-
- Bitte geben Sie hier die Anzahl der Vollgeschosse - an. Keller und Dachgeschoss mit Schrägen zählen - nicht dazu. -
-
+
+ -
- + - +
+ Bitte geben Sie hier die Geschosshöhe (lichte Raumhöhe + + Deckenstärke) des Gebäudes ein. Bei unterschiedlichen + Geschosshöhen bilden Sie einen Mittelwert. +
+
-
- Bitte geben Sie hier die Geschosshöhe (lichte - Raumhöhe + Deckenstärke) des Gebäudes ein. Bei - unterschiedlichen Geschosshöhen bilden Sie einen - Mittelwert. -
-
+
+ -
- + - +
+ Wenn Ihr Gebäude Dachgauben besitzt geben Sie hier die + Anzahl ein. +
+
-
- Wenn Ihr Gebäude Dachgauben besitzt geben Sie hier - die Anzahl ein. -
-
+
+ -
- + - +
+ Bitte geben Sie hier die Gesamtbreite aller Gauben in m + ein. +
+
+
+
-
- Bitte geben Sie hier die Gesamtbreite aller Gauben - in m ein. -
- - -
-
- - - -
-
+
-
-

Außenflächen, U-Werte und Volumen

-
- Die wärmeübertragende Umfassungsflächen sind die Hüllflächen des beheizten Gebäudes die an die Außenluft bzw. an unbeheizte Vorbauten grenzen. - Wenn Ihnen die Außenwand-,Dach-,Decken- und Bodenflächen vorliegen können Sie die Eingabe direkt vornehmen. - Hier können Sie auch das von den Umfassungsflächen eingeschlossene Volumen des Gebäudes eingeben. - Die ermittelten Werte der Berechnungshilfe können hier präzisiert werden. + > +
+

+ Außenflächen, U-Werte und Volumen +

+
+ Die wärmeübertragende Umfassungsflächen sind die + Hüllflächen des beheizten Gebäudes die an die Außenluft + bzw. an unbeheizte Vorbauten grenzen. Wenn Ihnen die + Außenwand-,Dach-,Decken- und Bodenflächen vorliegen + können Sie die Eingabe direkt vornehmen. Hier können Sie + auch das von den Umfassungsflächen eingeschlossene + Volumen des Gebäudes eingeben. Die ermittelten Werte der + Berechnungshilfe können hier präzisiert werden. +
+
+ +
+ + +
+
+ + +
+
+ +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
+
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ +
+ +
+
+
+
-
- -
- - -
-
- - - -
- -
- -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - - -
- -
-
- -
- - - -
- -
- - - - -
- -
- - - -
- -
- -
- -
-
- -
- - - - - \ No newline at end of file +--> diff --git a/src/components/Ausweis/LueftungundLeerstand.svelte b/src/components/Ausweis/LueftungundLeerstand.svelte index 853a87e0..420c5851 100644 --- a/src/components/Ausweis/LueftungundLeerstand.svelte +++ b/src/components/Ausweis/LueftungundLeerstand.svelte @@ -50,7 +50,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 required bind:value={aufnahme.lueftung} > - + + diff --git a/src/components/Ausweis/SanierungszustandFensterTueren.svelte b/src/components/Ausweis/SanierungszustandFensterTueren.svelte index 13ee27db..203eef64 100644 --- a/src/components/Ausweis/SanierungszustandFensterTueren.svelte +++ b/src/components/Ausweis/SanierungszustandFensterTueren.svelte @@ -1,7 +1,5 @@ diff --git a/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte b/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte index f1d21016..589470a7 100644 --- a/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte +++ b/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte @@ -1,5 +1,5 @@ -
+
{#if objekt.aufnahmen.length > 0} {@const bild = objekt.aufnahmen[0].bilder.find(bild => bild.kategorie === Enums.BilderKategorie.Gebaeude)}
@@ -21,18 +21,14 @@ {/if}
-
-
- Energieausweis ausgestellt -
-
Energieausweis
-
-
-
- Energieausweis ausgestellt -
-
Energieausweis
-
+ {#if objekt.aufnahmen.at(-1)?.verbrauchsausweise_wohnen.length} + +
+ Energieausweis ausgestellt +
+
Energieausweis
+
+ {/if}
{#each objekt.aufnahmen as aufnahme} @@ -42,12 +38,6 @@
-
-
- Detailübersicht
Stand vom {moment(aufnahme.erstellungsdatum).format("DD.MM.YYYY")}
- -
-
{/each}
diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index c5fbac65..059ef7f1 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -28,17 +28,16 @@ AufnahmeClient } from "#components/Ausweis/types.js"; - import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte"; - + export let ausweis: BedarfsausweisWohnenClient; export let objekt: ObjektClient export let aufnahme: AufnahmeClient export let user: BenutzerClient = {} as BenutzerClient; export let ausweistyp: Enums.AusweisTyp export let bilder: BildClient[] = [] - export let uid: string; + export let id: string; - if (!uid && (!ausweis.updated_at || moment(localStorage.getItem("bedarfsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at))) { + if (((user && user.rolle !== Enums.BenutzerRolle.ADMIN) || !user) && !id && (!ausweis.updated_at || moment(localStorage.getItem("bedarfsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at))) { const localStorageAusweis = localStorage.getItem("bedarfsausweis-wohnen.ausweis"); if (localStorageAusweis) { ausweis = JSON.parse(localStorageAusweis) @@ -61,68 +60,21 @@ } $: { - localStorage.setItem("bedarfsausweis-wohnen.ausweis", JSON.stringify(ausweis)) - localStorage.setItem("bedarfsausweis-wohnen.aufnahme", JSON.stringify(aufnahme)) - localStorage.setItem("bedarfsausweis-wohnen.objekt", JSON.stringify(objekt)) - localStorage.setItem("bedarfsausweis-wohnen.bilder", JSON.stringify(bilder)) - localStorage.setItem("bedarfsausweis-wohnen.updated_at", moment().toString()) + if (!blockLocalStorageSync) { + localStorage.setItem("bedarfsausweis-wohnen.ausweis", JSON.stringify(ausweis)) + localStorage.setItem("bedarfsausweis-wohnen.aufnahme", JSON.stringify(aufnahme)) + localStorage.setItem("bedarfsausweis-wohnen.objekt", JSON.stringify(objekt)) + localStorage.setItem("bedarfsausweis-wohnen.bilder", JSON.stringify(bilder)) + localStorage.setItem("bedarfsausweis-wohnen.updated_at", moment().toString()) + } } - let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4]; - - let fensterArten = { - Einfachverglasung: 5, - "Holzfenster Doppelverglasung": 2.7, - "Kunststofffenster Doppelverglasung": 3, - "Alu- oder Stahlfenster Doppelverglasung": 4.3, - "Fenster Doppelverglasung (ab 1995)": 1.8, - "Fenster Doppelverglasung (U-Wert 1,1)": 1.1, - "Dreifach-Wärmeschutzverglasung(U-Wert 0,9)": 0.9, - "Dreifach-Wärmeschutzverglasung(U-Wert 0,85)": 0.85, - "Passivhausfenster(U-Wert 0,7)": 0.7, - "Passivhausfenster(U-Wert 0,6)": 0.6, - "Fenster mit U-Wert 2,3": 2.3, - "Fenster mit U-Wert 1,6": 1.6, - "Fenster mit U-Wert 1,7": 1.7, - "Fenster mit U-Wert 1,3": 1.3, - "Fenster mit U-Wert 1": 1, - }; - - async function spaeterWeitermachen() { - // const result = await verbrauchsausweisWohnenSpeichern( - // ausweis, - // gebaeude, - // aufnahme, - // 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; - // aufnahme.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 }, - (value, index) => start + index * step - ); - const ausweisart = Enums.Ausweisart.BedarfsausweisWohnen const anliegen = "Energieausweis erstellen"; let form: HTMLFormElement; let skala: HTMLDivElement; + let blockLocalStorageSync: boolean = false; @@ -143,7 +95,19 @@
- + + @@ -240,16 +204,19 @@ title="Angabe zu Lüftung und Kühlung"
- + + diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte index 513a5f0d..8f473270 100644 --- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte +++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte @@ -42,16 +42,17 @@ } from "#components/Notifications/index.js"; export let ausweis: VerbrauchsausweisGewerbeClient; - export let user: BenutzerClient; + export let user: BenutzerClient | null; export let objekt: ObjektClient; export let ausweistyp: Enums.AusweisTyp; export let aufnahme: AufnahmeClient; export let bilder: BildClient[]; + export let id: string | null; const ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe const anliegen = "Energieausweis erstellen"; - if (!ausweis.updated_at || moment(localStorage.getItem("verbrauchsausweis-gewerbe.updated_at") || new Date()).isAfter(ausweis.updated_at)) { + if (((user && user.rolle !== Enums.BenutzerRolle.ADMIN) || !user) && !id && (!ausweis.updated_at || moment(localStorage.getItem("verbrauchsausweis-gewerbe.updated_at") || new Date()).isAfter(ausweis.updated_at))) { const localStorageAusweis = localStorage.getItem("verbrauchsausweis-gewerbe.ausweis"); if (localStorageAusweis) { ausweis = JSON.parse(localStorageAusweis) @@ -74,13 +75,16 @@ } $: { - localStorage.setItem("verbrauchsausweis-gewerbe.ausweis", JSON.stringify(ausweis)) - localStorage.setItem("verbrauchsausweis-gewerbe.aufnahme", JSON.stringify(aufnahme)) - localStorage.setItem("verbrauchsausweis-gewerbe.objekt", JSON.stringify(objekt)) - localStorage.setItem("verbrauchsausweis-gewerbe.bilder", JSON.stringify(bilder)) - localStorage.setItem("verbrauchsausweis-gewerbe.updated_at", moment().toString()) + if (!blockLocalStorageSync) { + localStorage.setItem("verbrauchsausweis-gewerbe.ausweis", JSON.stringify(ausweis)) + localStorage.setItem("verbrauchsausweis-gewerbe.aufnahme", JSON.stringify(aufnahme)) + localStorage.setItem("verbrauchsausweis-gewerbe.objekt", JSON.stringify(objekt)) + localStorage.setItem("verbrauchsausweis-gewerbe.bilder", JSON.stringify(bilder)) + localStorage.setItem("verbrauchsausweis-gewerbe.updated_at", moment().toString()) + } } + let blockLocalStorageSync: boolean = false; let form: HTMLFormElement; let skala: HTMLDivElement; @@ -114,6 +118,7 @@ bind:user bind:objekt bind:aufnahme + bind:blockLocalStorageSync ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} showWeiter={false} {form} @@ -229,6 +234,7 @@ bind:user bind:objekt bind:aufnahme + bind:blockLocalStorageSync ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} showWeiter={true} {form} diff --git a/src/pages/api/ticket/index.ts b/src/pages/api/ticket/index.ts index d2b46e8b..d63fb87c 100644 --- a/src/pages/api/ticket/index.ts +++ b/src/pages/api/ticket/index.ts @@ -3,6 +3,8 @@ import { prisma } from "#lib/server/prisma.js"; import { defineApiRoute } from "astro-typesafe-api/server"; import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { TicketsSchema } from "src/generated/zod/tickets.js"; +import { generatePrefixedId } from "#lib/db.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; export const PUT = defineApiRoute({ meta: { @@ -20,23 +22,22 @@ export const PUT = defineApiRoute({ id: true, prioritaet: true, status: true, - uid: true, updated_at: true, }), output: z.object({ - uid: UUidWithPrefix, + id: UUidWithPrefix, }), async fetch(input, ctx) { + const id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket) + const ticket = await prisma.tickets.create({ data: { + id, beschreibung: input.beschreibung, email: input.email, titel: input.titel, metadata: input.metadata, - }, - select: { - uid: true, - }, + } }); // Das sind die Label IDs von Trello @@ -71,7 +72,7 @@ export const PUT = defineApiRoute({ return { - uid: ticket.uid, + id: ticket.id, }; }, }); diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro index c5f82af1..c20f5b8c 100644 --- a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro +++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro @@ -1,112 +1,85 @@ --- import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types"; -import { createCaller } from "src/astro-typesafe-api-caller"; -import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; -import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte"; -import { Enums } from "#lib/server/prisma"; +import { Aufnahme, Enums, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma"; +import { getAufnahme, getObjekt, getBilder, getVerbrauchsausweisGewerbe } from "#lib/server/db"; +import { getCurrentUser } from "#lib/server/user"; -const id = Astro.url.searchParams.get("uid"); +const id = Astro.url.searchParams.get("id"); const aufnahme_id = Astro.url.searchParams.get("aufnahme") -const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard; +let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard; let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient; let objekt: ObjektClient = {} as ObjektClient; let bilder: BildClient[] = [] -const valid = validateAccessTokenServer(Astro); - -const caller = createCaller(Astro); +const user = await getCurrentUser(Astro) if (id) { - if (!valid) { + if (!user) { return Astro.redirect( `/auth/login?redirect=${Astro.url.toString()}` ); } - try { - let { aufnahme_id, objekt_id, benutzer_id, ...result } = await caller["verbrauchsausweis-gewerbe"]._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id - } - }); + ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe - ausweis = result - - aufnahme = await caller.aufnahme._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: aufnahme_id - } - }) - - objekt = await caller.objekt._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: objekt_id - } - }) - - bilder = await caller.aufnahme._id.bilder.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: aufnahme_id - } - }) - - if (!ausweis) { - // Der Ausweis scheint nicht zu existieren. - // Wir leiten auf die generische Ausweisseite ohne UID weiter. - return Astro.redirect( - "/energieausweis-erstellen/verbrauchsausweis-gewerbe" - ); - } - } catch(e) { + if (!ausweis || ausweis.benutzer_id !== user.id) { + // Der Ausweis scheint nicht zu existieren. + // Wir leiten auf die generische Ausweisseite ohne ID weiter. return Astro.redirect( - "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" ); } + + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme + + if (!aufnahme) { + // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } + + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } + + bilder = await getBilder(aufnahme.id); } else if (aufnahme_id) { - if (!valid) { + if (!user) { return Astro.redirect( `/auth/login?redirect=${Astro.url.toString()}` ); } - let { objekt_id, ...result} = await caller.aufnahme._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: aufnahme_id - } - }) + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme - aufnahme = result; + if (!aufnahme) { + // Die Aufnahme existiert wohl nicht. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } - objekt = await caller.objekt._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: objekt_id - } - }) + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } } --- - + \ No newline at end of file From 0b893200079db7dead6d7569752e9783c0701b43 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Sun, 6 Apr 2025 10:42:36 -0400 Subject: [PATCH 2/2] Speichern verbessert --- src/client/lib/ausweisSpeichern.ts | 679 +++++++++++++----- src/client/lib/nachweisSpeichern.ts | 332 ++++----- src/client/lib/speichern.ts | 164 +++++ .../Ausweis/ButtonWeiterHilfe.svelte | 53 +- src/modules/KundendatenModule.svelte | 4 +- src/pages/api/bedarfsausweis-gewerbe/[id].ts | 46 +- src/pages/api/bedarfsausweis-gewerbe/index.ts | 52 +- src/pages/api/bedarfsausweis-wohnen/[id].ts | 74 +- src/pages/api/bedarfsausweis-wohnen/index.ts | 104 ++- src/pages/api/geg-nachweis-gewerbe/[id].ts | 51 +- src/pages/api/geg-nachweis-gewerbe/index.ts | 11 +- src/pages/api/geg-nachweis-wohnen/[id].ts | 6 + src/pages/api/geg-nachweis-wohnen/index.ts | 11 +- 13 files changed, 1030 insertions(+), 557 deletions(-) create mode 100644 src/client/lib/speichern.ts diff --git a/src/client/lib/ausweisSpeichern.ts b/src/client/lib/ausweisSpeichern.ts index 4d3eebbb..7a8cf726 100644 --- a/src/client/lib/ausweisSpeichern.ts +++ b/src/client/lib/ausweisSpeichern.ts @@ -1,221 +1,516 @@ - -import { api } from "astro-typesafe-api/client" +import { api } from "astro-typesafe-api/client"; import { exclude } from "#lib/exclude.js"; import Cookies from "js-cookie"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; -import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js"; -import { Enums } from "#lib/client/prisma.js"; +import { + AufnahmeClient, + BedarfsausweisWohnenClient, + BildClient, + ObjektClient, + VerbrauchsausweisGewerbeClient, + VerbrauchsausweisWohnenClient, +} from "#components/Ausweis/types.js"; +import { + BedarfsausweisWohnen, + Enums, + VerbrauchsausweisGewerbe, + VerbrauchsausweisWohnen, +} from "#lib/client/prisma.js"; +import { tryCatch } from "#lib/tryCatch.js"; +import { addNotification } from "@ibcornelsen/ui"; +import { objektSpeichern, aufnahmeSpeichern } from "./speichern.js"; + +export async function verbrauchsausweisWohnenSpeichern( + ausweis: VerbrauchsausweisWohnen, + aufnahme_id: string +): Promise { + if (ausweis.id) { + await api["verbrauchsausweis-wohnen"]._id.PATCH.fetch( + { + ausweistyp: ausweis.ausweistyp, + startdatum: ausweis.startdatum, + alternative_heizung: ausweis.alternative_heizung, + alternative_kuehlung: ausweis.alternative_kuehlung, + alternative_lueftung: ausweis.alternative_lueftung, + alternative_warmwasser: ausweis.alternative_warmwasser, + anteil_warmwasser_1: ausweis.anteil_warmwasser_1, + anteil_warmwasser_2: ausweis.anteil_warmwasser_2, + ausgestellt: ausweis.ausgestellt, + ausstellgrund: ausweis.ausstellgrund, + ausstellungsdatum: ausweis.ausstellungsdatum, + beschreibung: ausweis.beschreibung, + bestellt: ausweis.bestellt, + boxpruefung: ausweis.boxpruefung, + brennstoff_1: ausweis.brennstoff_1, + brennstoff_2: ausweis.brennstoff_2, + einheit_1: ausweis.einheit_1, + einheit_2: ausweis.einheit_2, + energieeffizienzklasse: ausweis.energieeffizienzklasse, + faktorKeller: ausweis.faktorKeller, + kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt, + prueftext: ausweis.prueftext, + registriernummer: ausweis.registriernummer, + storniert: ausweis.storniert, + verbrauch_1: ausweis.verbrauch_1, + verbrauch_2: ausweis.verbrauch_2, + verbrauch_3: ausweis.verbrauch_3, + verbrauch_4: ausweis.verbrauch_4, + verbrauch_5: ausweis.verbrauch_5, + verbrauch_6: ausweis.verbrauch_6, + warmwasser_anteil_bekannt: ausweis.warmwasser_anteil_bekannt, + warmwasser_enthalten: ausweis.warmwasser_enthalten, + zurueckgestellt: ausweis.zurueckgestellt, + zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle, + }, + { + params: { + id: ausweis.id, + }, + headers: { + Authorization: `Bearer ${Cookies.get( + API_ACCESS_TOKEN_COOKIE_NAME + )}`, + }, + } + ); + + return ausweis.id; + } else { + const { id } = await api["verbrauchsausweis-wohnen"].PUT.fetch( + { + ausweis: { + ausweistyp: ausweis.ausweistyp, + startdatum: ausweis.startdatum, + alternative_heizung: ausweis.alternative_heizung, + alternative_kuehlung: ausweis.alternative_kuehlung, + alternative_lueftung: ausweis.alternative_lueftung, + alternative_warmwasser: ausweis.alternative_warmwasser, + anteil_warmwasser_1: ausweis.anteil_warmwasser_1, + anteil_warmwasser_2: ausweis.anteil_warmwasser_2, + ausgestellt: ausweis.ausgestellt, + ausstellgrund: ausweis.ausstellgrund, + ausstellungsdatum: ausweis.ausstellungsdatum, + beschreibung: ausweis.beschreibung, + bestellt: ausweis.bestellt, + boxpruefung: ausweis.boxpruefung, + brennstoff_1: ausweis.brennstoff_1, + brennstoff_2: ausweis.brennstoff_2, + einheit_1: ausweis.einheit_1, + einheit_2: ausweis.einheit_2, + energieeffizienzklasse: ausweis.energieeffizienzklasse, + faktorKeller: ausweis.faktorKeller, + kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt, + prueftext: ausweis.prueftext, + registriernummer: ausweis.registriernummer, + storniert: ausweis.storniert, + verbrauch_1: ausweis.verbrauch_1, + verbrauch_2: ausweis.verbrauch_2, + verbrauch_3: ausweis.verbrauch_3, + verbrauch_4: ausweis.verbrauch_4, + verbrauch_5: ausweis.verbrauch_5, + verbrauch_6: ausweis.verbrauch_6, + warmwasser_anteil_bekannt: + ausweis.warmwasser_anteil_bekannt, + warmwasser_enthalten: ausweis.warmwasser_enthalten, + zurueckgestellt: ausweis.zurueckgestellt, + zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle, + }, + aufnahme_id, + }, + { + headers: { + Authorization: `Bearer ${Cookies.get( + API_ACCESS_TOKEN_COOKIE_NAME + )}`, + }, + } + ); + + return id; + } +} + +export async function verbrauchsausweisGewerbeSpeichern( + ausweis: VerbrauchsausweisGewerbe, + aufnahme_id: string +): Promise { + if (ausweis.id) { + await api["verbrauchsausweis-gewerbe"]._id.PATCH.fetch( + { + ausweistyp: ausweis.ausweistyp, + startdatum: ausweis.startdatum, + alternative_heizung: ausweis.alternative_heizung, + alternative_kuehlung: ausweis.alternative_kuehlung, + alternative_lueftung: ausweis.alternative_lueftung, + alternative_warmwasser: ausweis.alternative_warmwasser, + anteil_warmwasser_1: ausweis.anteil_warmwasser_1, + anteil_warmwasser_2: ausweis.anteil_warmwasser_2, + ausgestellt: ausweis.ausgestellt, + ausstellgrund: ausweis.ausstellgrund, + ausstellungsdatum: ausweis.ausstellungsdatum, + beschreibung: ausweis.beschreibung, + bestellt: ausweis.bestellt, + boxpruefung: ausweis.boxpruefung, + brennstoff_1: ausweis.brennstoff_1, + brennstoff_2: ausweis.brennstoff_2, + einheit_1: ausweis.einheit_1, + einheit_2: ausweis.einheit_2, + energieeffizienzklasse: ausweis.energieeffizienzklasse, + kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt, + prueftext: ausweis.prueftext, + registriernummer: ausweis.registriernummer, + storniert: ausweis.storniert, + verbrauch_1: ausweis.verbrauch_1, + verbrauch_2: ausweis.verbrauch_2, + verbrauch_3: ausweis.verbrauch_3, + verbrauch_4: ausweis.verbrauch_4, + verbrauch_5: ausweis.verbrauch_5, + verbrauch_6: ausweis.verbrauch_6, + warmwasser_anteil_bekannt: ausweis.warmwasser_anteil_bekannt, + warmwasser_enthalten: ausweis.warmwasser_enthalten, + zurueckgestellt: ausweis.zurueckgestellt, + zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle, + anteil_kuehlung_1: ausweis.anteil_kuehlung_1, + anteil_kuehlung_2: ausweis.anteil_kuehlung_2, + keller_beheizt: ausweis.keller_beheizt, + kuehlung_enthalten: ausweis.kuehlung_enthalten, + rechnung_id: ausweis.rechnung_id, + strom_1: ausweis.strom_1, + strom_2: ausweis.strom_2, + strom_3: ausweis.strom_3, + stromverbrauch_enthaelt_beleuchtung: + ausweis.stromverbrauch_enthaelt_beleuchtung, + stromverbrauch_enthaelt_heizung: + ausweis.stromverbrauch_enthaelt_heizung, + stromverbrauch_enthaelt_kuehlung: + ausweis.stromverbrauch_enthaelt_kuehlung, + stromverbrauch_enthaelt_lueftung: + ausweis.stromverbrauch_enthaelt_lueftung, + stromverbrauch_enthaelt_sonstige: + ausweis.stromverbrauch_enthaelt_sonstige, + stromverbrauch_enthaelt_warmwasser: + ausweis.stromverbrauch_enthaelt_warmwasser, + }, + { + params: { + id: ausweis.id, + }, + headers: { + Authorization: `Bearer ${Cookies.get( + API_ACCESS_TOKEN_COOKIE_NAME + )}`, + }, + } + ); + + return ausweis.id; + } else { + const { id } = await api["verbrauchsausweis-gewerbe"].PUT.fetch( + { + ausweis: { + ausweistyp: ausweis.ausweistyp, + startdatum: ausweis.startdatum, + alternative_heizung: ausweis.alternative_heizung, + alternative_kuehlung: ausweis.alternative_kuehlung, + alternative_lueftung: ausweis.alternative_lueftung, + alternative_warmwasser: ausweis.alternative_warmwasser, + anteil_warmwasser_1: ausweis.anteil_warmwasser_1, + anteil_warmwasser_2: ausweis.anteil_warmwasser_2, + ausgestellt: ausweis.ausgestellt, + ausstellgrund: ausweis.ausstellgrund, + ausstellungsdatum: ausweis.ausstellungsdatum, + beschreibung: ausweis.beschreibung, + bestellt: ausweis.bestellt, + boxpruefung: ausweis.boxpruefung, + brennstoff_1: ausweis.brennstoff_1, + brennstoff_2: ausweis.brennstoff_2, + einheit_1: ausweis.einheit_1, + einheit_2: ausweis.einheit_2, + energieeffizienzklasse: ausweis.energieeffizienzklasse, + kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt, + prueftext: ausweis.prueftext, + registriernummer: ausweis.registriernummer, + storniert: ausweis.storniert, + verbrauch_1: ausweis.verbrauch_1, + verbrauch_2: ausweis.verbrauch_2, + verbrauch_3: ausweis.verbrauch_3, + verbrauch_4: ausweis.verbrauch_4, + verbrauch_5: ausweis.verbrauch_5, + verbrauch_6: ausweis.verbrauch_6, + warmwasser_anteil_bekannt: + ausweis.warmwasser_anteil_bekannt, + warmwasser_enthalten: ausweis.warmwasser_enthalten, + zurueckgestellt: ausweis.zurueckgestellt, + zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle, + anteil_kuehlung_1: ausweis.anteil_kuehlung_1, + anteil_kuehlung_2: ausweis.anteil_kuehlung_2, + keller_beheizt: ausweis.keller_beheizt, + kuehlung_enthalten: ausweis.kuehlung_enthalten, + rechnung_id: ausweis.rechnung_id, + strom_1: ausweis.strom_1, + strom_2: ausweis.strom_2, + strom_3: ausweis.strom_3, + stromverbrauch_enthaelt_beleuchtung: + ausweis.stromverbrauch_enthaelt_beleuchtung, + stromverbrauch_enthaelt_heizung: + ausweis.stromverbrauch_enthaelt_heizung, + stromverbrauch_enthaelt_kuehlung: + ausweis.stromverbrauch_enthaelt_kuehlung, + stromverbrauch_enthaelt_lueftung: + ausweis.stromverbrauch_enthaelt_lueftung, + stromverbrauch_enthaelt_sonstige: + ausweis.stromverbrauch_enthaelt_sonstige, + stromverbrauch_enthaelt_warmwasser: + ausweis.stromverbrauch_enthaelt_warmwasser, + }, + aufnahme_id, + }, + { + headers: { + Authorization: `Bearer ${Cookies.get( + API_ACCESS_TOKEN_COOKIE_NAME + )}`, + }, + } + ); + + return id; + } +} + +export async function bedarfsausweisWohnenSpeichern( + ausweis: BedarfsausweisWohnen, + aufnahme_id: string +): Promise { + if (ausweis.id) { + await api["bedarfsausweis-wohnen"]._id.PATCH.fetch( + { + ausweistyp: ausweis.ausweistyp, + alternative_heizung: ausweis.alternative_heizung, + alternative_kuehlung: ausweis.alternative_kuehlung, + alternative_lueftung: ausweis.alternative_lueftung, + alternative_warmwasser: ausweis.alternative_warmwasser, + ausstellgrund: ausweis.ausstellgrund, + ausstellungsdatum: ausweis.ausstellungsdatum, + beschreibung: ausweis.beschreibung, + boxpruefung: ausweis.boxpruefung, + energieeffizienzklasse: ausweis.energieeffizienzklasse, + kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt, + prueftext: ausweis.prueftext, + registriernummer: ausweis.registriernummer, + anteil_zusatzheizung: ausweis.anteil_zusatzheizung, + anzahl_gauben: ausweis.anzahl_gauben, + anzahl_vollgeschosse: ausweis.anzahl_vollgeschosse, + aussenwand_bauart: ausweis.aussenwand_bauart, + aussenwand_daemmung: ausweis.aussenwand_daemmung, + aussenwand_flaeche: ausweis.aussenwand_flaeche, + aussenwand_u_wert: ausweis.aussenwand_u_wert, + aussenwandflaeche_unbeheizt: + ausweis.aussenwandflaeche_unbeheizt, + boden_bauart: ausweis.boden_bauart, + boden_daemmung: ausweis.boden_daemmung, + breite_gauben: ausweis.breite_gauben, + dach_bauart: ausweis.dach_bauart, + dach_daemmung: ausweis.dach_daemmung, + dach_u_wert: ausweis.dach_u_wert, + dachfenster_art: ausweis.dachfenster_art, + dachfenster_flaeche: ausweis.dachfenster_flaeche, + dachflaeche: ausweis.dachflaeche, + decke_bauart: ausweis.decke_bauart, + decke_daemmung: ausweis.decke_daemmung, + decke_u_wert: ausweis.decke_u_wert, + deckenflaeche: ausweis.deckenflaeche, + dicht: ausweis.dicht, + fenster_art_1: ausweis.fenster_art_1, + fenster_art_2: ausweis.fenster_art_2, + fenster_flaeche_1: ausweis.fenster_flaeche_1, + fenster_flaeche_2: ausweis.fenster_flaeche_2, + fensterflaeche_nw_no: ausweis.fensterflaeche_nw_no, + fensterflaeche_so_sw: ausweis.fensterflaeche_so_sw, + fussboden_flaeche: ausweis.fussboden_flaeche, + fussboden_u_wert: ausweis.fussboden_u_wert, + geschosshoehe: ausweis.geschosshoehe, + haustuer_art: ausweis.haustuer_art, + haustuer_flaeche: ausweis.haustuer_flaeche, + heizung_speicherung: ausweis.heizung_speicherung, + heizung_verteilung: ausweis.heizung_verteilung, + heizung_zentral: ausweis.heizung_zentral, + kollektor_flaeche: ausweis.kollektor_flaeche, + masse_a: ausweis.masse_a, + masse_b: ausweis.masse_b, + masse_c: ausweis.masse_c, + masse_d: ausweis.masse_d, + masse_e: ausweis.masse_e, + masse_f: ausweis.masse_f, + volumen: ausweis.volumen, + waerme_erzeugung_heizung: ausweis.waerme_erzeugung_heizung, + warmwasser_erzeugung: ausweis.warmwasser_erzeugung, + warmwasser_speicherung: ausweis.warmwasser_speicherung, + warmwasser_verteilung: ausweis.warmwasser_verteilung, + }, + { + params: { + id: ausweis.id, + }, + headers: { + Authorization: `Bearer ${Cookies.get( + API_ACCESS_TOKEN_COOKIE_NAME + )}`, + }, + } + ); + + return ausweis.id; + } else { + const id = await api["bedarfsausweis-wohnen"].PUT.fetch( + { + ausweis: { + ausweistyp: ausweis.ausweistyp, + alternative_heizung: ausweis.alternative_heizung, + alternative_kuehlung: ausweis.alternative_kuehlung, + alternative_lueftung: ausweis.alternative_lueftung, + alternative_warmwasser: ausweis.alternative_warmwasser, + ausstellgrund: ausweis.ausstellgrund, + ausstellungsdatum: ausweis.ausstellungsdatum, + beschreibung: ausweis.beschreibung, + boxpruefung: ausweis.boxpruefung, + energieeffizienzklasse: ausweis.energieeffizienzklasse, + kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt, + prueftext: ausweis.prueftext, + registriernummer: ausweis.registriernummer, + anteil_zusatzheizung: ausweis.anteil_zusatzheizung, + anzahl_gauben: ausweis.anzahl_gauben, + anzahl_vollgeschosse: ausweis.anzahl_vollgeschosse, + aussenwand_bauart: ausweis.aussenwand_bauart, + aussenwand_daemmung: ausweis.aussenwand_daemmung, + aussenwand_flaeche: ausweis.aussenwand_flaeche, + aussenwand_u_wert: ausweis.aussenwand_u_wert, + aussenwandflaeche_unbeheizt: + ausweis.aussenwandflaeche_unbeheizt, + boden_bauart: ausweis.boden_bauart, + boden_daemmung: ausweis.boden_daemmung, + breite_gauben: ausweis.breite_gauben, + dach_bauart: ausweis.dach_bauart, + dach_daemmung: ausweis.dach_daemmung, + dach_u_wert: ausweis.dach_u_wert, + dachfenster_art: ausweis.dachfenster_art, + dachfenster_flaeche: ausweis.dachfenster_flaeche, + dachflaeche: ausweis.dachflaeche, + decke_bauart: ausweis.decke_bauart, + decke_daemmung: ausweis.decke_daemmung, + decke_u_wert: ausweis.decke_u_wert, + deckenflaeche: ausweis.deckenflaeche, + dicht: ausweis.dicht, + fenster_art_1: ausweis.fenster_art_1, + fenster_art_2: ausweis.fenster_art_2, + fenster_flaeche_1: ausweis.fenster_flaeche_1, + fenster_flaeche_2: ausweis.fenster_flaeche_2, + fensterflaeche_nw_no: ausweis.fensterflaeche_nw_no, + fensterflaeche_so_sw: ausweis.fensterflaeche_so_sw, + fussboden_flaeche: ausweis.fussboden_flaeche, + fussboden_u_wert: ausweis.fussboden_u_wert, + geschosshoehe: ausweis.geschosshoehe, + haustuer_art: ausweis.haustuer_art, + haustuer_flaeche: ausweis.haustuer_flaeche, + heizung_speicherung: ausweis.heizung_speicherung, + heizung_verteilung: ausweis.heizung_verteilung, + heizung_zentral: ausweis.heizung_zentral, + kollektor_flaeche: ausweis.kollektor_flaeche, + masse_a: ausweis.masse_a, + masse_b: ausweis.masse_b, + masse_c: ausweis.masse_c, + masse_d: ausweis.masse_d, + masse_e: ausweis.masse_e, + masse_f: ausweis.masse_f, + volumen: ausweis.volumen, + waerme_erzeugung_heizung: ausweis.waerme_erzeugung_heizung, + warmwasser_erzeugung: ausweis.warmwasser_erzeugung, + warmwasser_speicherung: ausweis.warmwasser_speicherung, + warmwasser_verteilung: ausweis.warmwasser_verteilung, + }, + aufnahme_id, + }, + { + headers: { + Authorization: `Bearer ${Cookies.get( + API_ACCESS_TOKEN_COOKIE_NAME + )}`, + }, + } + ); + + return id; + } +} export async function ausweisSpeichern( - ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, + ausweis: + | VerbrauchsausweisWohnenClient + | VerbrauchsausweisGewerbeClient + | BedarfsausweisWohnenClient, objekt: ObjektClient, aufnahme: AufnahmeClient, bilder: BildClient[], ausweisart: Enums.Ausweisart ) { - if (objekt.id) { - await api.objekt._id.PATCH.fetch({ - adresse: objekt.adresse, - latitude: 0, - longitude: 0, - ort: objekt.ort, - plz: objekt.plz - }, { - params: { - id: objekt.id - }, - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) -} else { - const { id } = await api.objekt.PUT.fetch({ - adresse: objekt.adresse, - latitude: 0, - longitude: 0, - ort: objekt.ort, - plz: objekt.plz - }, { - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) + const [objekt_id, objekt_error] = await tryCatch(objektSpeichern(objekt)); - objekt.id = id; + if (objekt_error) { + addNotification({ + message: "Das hat nicht geklappt.", + subtext: + "Beim Speichern des Objektes ist ein Fehler aufgetreten, bitte versuchen sie es erneut.", + }); + + return; } + objekt.id = objekt_id; + let [aufnahme_id, aufnahme_error] = await tryCatch( + aufnahmeSpeichern(aufnahme, objekt_id) + ); - if (aufnahme.id) { - await api.aufnahme._id.PATCH.fetch({ - baujahr_gebaeude: aufnahme.baujahr_gebaeude, - baujahr_heizung: aufnahme.baujahr_heizung, - baujahr_klima: aufnahme.baujahr_klima || [], - alternative_heizung: aufnahme.alternative_heizung, - alternative_kuehlung: aufnahme.alternative_kuehlung, - alternative_lueftung: aufnahme.alternative_lueftung, - alternative_warmwasser: aufnahme.alternative_warmwasser, - aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, - aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, - brennwert_kessel: aufnahme.brennwert_kessel, - dachgeschoss: aufnahme.dachgeschoss, - dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, - dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, - doppel_verglasung: aufnahme.doppel_verglasung, - dreifach_verglasung: aufnahme.dreifach_verglasung, - durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, - einfach_verglasung: aufnahme.einfach_verglasung, - einheiten: aufnahme.einheiten, - einzelofen: aufnahme.einzelofen, - fenster_dicht: aufnahme.fenster_dicht, - fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, - flaeche: aufnahme.flaeche, - gebaeudeteil: aufnahme.gebaeudeteil, - gebaeudetyp: aufnahme.gebaeudetyp, - heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, - isolier_verglasung: aufnahme.isolier_verglasung, - keller: aufnahme.keller, - keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, - keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, - kuehlung: aufnahme.kuehlung, - leerstand: aufnahme.leerstand, - lueftung: aufnahme.lueftung, - niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, - nutzflaeche: aufnahme.nutzflaeche, - oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, - oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, - photovoltaik: aufnahme.photovoltaik, - raum_temperatur_regler: aufnahme.raum_temperatur_regler, - rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, - saniert: aufnahme.saniert, - solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, - standard_kessel: aufnahme.standard_kessel, - tueren_dicht: aufnahme.tueren_dicht, - tueren_undicht: aufnahme.tueren_undicht, - waermepumpe: aufnahme.waermepumpe, - warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, - zentralheizung: aufnahme.zentralheizung, - zirkulation: aufnahme.zirkulation - }, { - params: { - id: aufnahme.id - }, - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) - } else { - const { id } = await api.aufnahme.PUT.fetch({ - aufnahme: { - baujahr_gebaeude: aufnahme.baujahr_gebaeude, - baujahr_heizung: aufnahme.baujahr_heizung, - alternative_heizung: aufnahme.alternative_heizung, - alternative_kuehlung: aufnahme.alternative_kuehlung, - alternative_lueftung: aufnahme.alternative_lueftung, - alternative_warmwasser: aufnahme.alternative_warmwasser, - aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, - aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, - baujahr_klima: aufnahme.baujahr_klima, - brennwert_kessel: aufnahme.brennwert_kessel, - dachgeschoss: aufnahme.dachgeschoss, - dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, - dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, - doppel_verglasung: aufnahme.doppel_verglasung, - dreifach_verglasung: aufnahme.dreifach_verglasung, - durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, - einfach_verglasung: aufnahme.einfach_verglasung, - einheiten: aufnahme.einheiten, - einzelofen: aufnahme.einzelofen, - erstellungsdatum: aufnahme.erstellungsdatum, - fenster_dicht: aufnahme.fenster_dicht, - fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, - flaeche: aufnahme.flaeche, - gebaeudeteil: aufnahme.gebaeudeteil, - gebaeudetyp: aufnahme.gebaeudetyp, - heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, - isolier_verglasung: aufnahme.isolier_verglasung, - keller: aufnahme.keller, - keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, - keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, - kuehlung: aufnahme.kuehlung, - leerstand: aufnahme.leerstand, - lueftung: aufnahme.lueftung, - niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, - nutzflaeche: aufnahme.nutzflaeche, - oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, - oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, - photovoltaik: aufnahme.photovoltaik, - raum_temperatur_regler: aufnahme.raum_temperatur_regler, - rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, - saniert: aufnahme.saniert, - solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, - standard_kessel: aufnahme.standard_kessel, - tueren_dicht: aufnahme.tueren_dicht, - tueren_undicht: aufnahme.tueren_undicht, - waermepumpe: aufnahme.waermepumpe, - warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, - zentralheizung: aufnahme.zentralheizung, - zirkulation: aufnahme.zirkulation - }, - objekt_id: objekt.id - }, { - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) + if (aufnahme_error) { + addNotification({ + message: "Das hat nicht geklappt.", + subtext: + "Beim Speichern der Objektaufnahme ist ein Fehler aufgetreten, bitte versuchen sie es erneut.", + }); - aufnahme.id = id + return; } - let patchRoute: any; - let putRoute: any; + aufnahme.id = aufnahme_id; + if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { - patchRoute = api["verbrauchsausweis-wohnen"]._id.PATCH - putRoute = api["verbrauchsausweis-wohnen"].PUT + const id = await verbrauchsausweisWohnenSpeichern(ausweis as VerbrauchsausweisWohnen, aufnahme_id) + ausweis.id = id; } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) { - patchRoute = api["verbrauchsausweis-gewerbe"]._id.PATCH - putRoute = api["verbrauchsausweis-gewerbe"].PUT + const id = await verbrauchsausweisGewerbeSpeichern(ausweis as VerbrauchsausweisGewerbe, aufnahme_id) + ausweis.id = id; } else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) { - patchRoute = api["bedarfsausweis-wohnen"]._id.PATCH - putRoute = api["bedarfsausweis-wohnen"].PUT - } - - if (ausweis.id) { - await patchRoute.fetch({ - ...exclude(ausweis, ["id"]) - }, { - params: { - id: ausweis.id - }, - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) - } else { - const { id } = await putRoute.fetch({ - ausweis, - aufnahme_id: aufnahme.id - }, { - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) - + const id = await bedarfsausweisWohnenSpeichern(ausweis as BedarfsausweisWohnen, aufnahme_id) ausweis.id = id; } - await api.aufnahme._id.bilder.PUT.fetch(bilder.map(bild => bild.id), { - params: { - id: aufnahme.id - }, - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + await api.aufnahme._id.bilder.PUT.fetch( + bilder.map((bild) => bild.id), + { + params: { + id: aufnahme.id, + }, + headers: { + Authorization: `Bearer ${Cookies.get( + API_ACCESS_TOKEN_COOKIE_NAME + )}`, + }, } - }) - + ); + return { ausweis_id: ausweis.id, aufnahme_id: aufnahme.id, - objekt_id: objekt.id - } + objekt_id: objekt.id, + }; } diff --git a/src/client/lib/nachweisSpeichern.ts b/src/client/lib/nachweisSpeichern.ts index b5243e33..f8d2f38a 100644 --- a/src/client/lib/nachweisSpeichern.ts +++ b/src/client/lib/nachweisSpeichern.ts @@ -1,10 +1,143 @@ import { api } from "astro-typesafe-api/client" -import { exclude } from "#lib/exclude.js"; import Cookies from "js-cookie"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { AufnahmeClient, BildClient, ObjektClient, } from "#components/Ausweis/types.js"; import { BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.js"; +import { tryCatch } from "#lib/tryCatch.js"; +import { addNotification } from "#components/Notifications/shared.js"; +import { aufnahmeSpeichern, objektSpeichern } from "./speichern.js"; + +export async function gegNachweisWohnenSpeichern(nachweis: GEGNachweisWohnen, aufnahme_id: string): Promise { + if (nachweis.id) { + await api["geg-nachweis-wohnen"]._id.PATCH.fetch({ + nachweistyp: nachweis.nachweistyp, + ausstellgrund: nachweis.ausstellgrund, + beschreibung: nachweis.beschreibung, + keller_beheizt: nachweis.keller_beheizt, + }, { + params: { + id: nachweis.id + }, + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return nachweis.id + } else { + const { id } = await api["geg-nachweis-wohnen"].PUT.fetch({ + nachweis: { + nachweistyp: nachweis.nachweistyp, + ausstellgrund: nachweis.ausstellgrund, + beschreibung: nachweis.beschreibung, + keller_beheizt: nachweis.keller_beheizt, + }, + aufnahme_id + }, { + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return id + } +} + +export async function gegNachweisGewerbeSpeichern(nachweis: GEGNachweisGewerbe, aufnahme_id: string): Promise { + if (nachweis.id) { + await api["geg-nachweis-gewerbe"]._id.PATCH.fetch({ + nachweistyp: nachweis.nachweistyp, + ausstellgrund: nachweis.ausstellgrund, + beschreibung: nachweis.beschreibung, + keller_beheizt: nachweis.keller_beheizt, + }, { + params: { + id: nachweis.id + }, + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return nachweis.id + } else { + const { id } = await api["geg-nachweis-gewerbe"].PUT.fetch({ + nachweis: { + nachweistyp: nachweis.nachweistyp, + ausstellgrund: nachweis.ausstellgrund, + beschreibung: nachweis.beschreibung, + keller_beheizt: nachweis.keller_beheizt, + }, + aufnahme_id + }, { + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return id + } +} + +export async function bedarfsausweisGewerbeSpeichern(nachweis: BedarfsausweisGewerbe, aufnahme_id: string): Promise { + if (nachweis.id) { + await api["bedarfsausweis-gewerbe"]._id.PATCH.fetch({ + nachweistyp: nachweis.nachweistyp, + ausstellgrund: nachweis.ausstellgrund, + abluftanlage: nachweis.abluftanlage, + bauteilaktivierung: nachweis.bauteilaktivierung, + direktheizung: nachweis.direktheizung, + dunkelstrahler: nachweis.dunkelstrahler, + fussbodenheizung: nachweis.fussbodenheizung, + hallenheizung: nachweis.hallenheizung, + infrarotstrahler: nachweis.infrarotstrahler, + keller_beheizt: nachweis.keller_beheizt, + klimatisierung: nachweis.klimatisierung, + konditionierung_der_zuluft: nachweis.konditionierung_der_zuluft, + luftheizung: nachweis.luftheizung, + zu_abluftanlage: nachweis.zu_abluftanlage + }, { + params: { + id: nachweis.id + }, + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return nachweis.id + } else { + const id = await api["bedarfsausweis-gewerbe"].PUT.fetch({ + nachweis: { + nachweistyp: nachweis.nachweistyp, + ausstellgrund: nachweis.ausstellgrund, + abluftanlage: nachweis.abluftanlage, + bauteilaktivierung: nachweis.bauteilaktivierung, + direktheizung: nachweis.direktheizung, + dunkelstrahler: nachweis.dunkelstrahler, + fussbodenheizung: nachweis.fussbodenheizung, + hallenheizung: nachweis.hallenheizung, + infrarotstrahler: nachweis.infrarotstrahler, + keller_beheizt: nachweis.keller_beheizt, + klimatisierung: nachweis.klimatisierung, + konditionierung_der_zuluft: nachweis.konditionierung_der_zuluft, + luftheizung: nachweis.luftheizung, + zu_abluftanlage: nachweis.zu_abluftanlage + }, + aufnahme_id + }, { + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return id + } +} + + + export async function nachweisSpeichern( nachweis: BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe, @@ -14,195 +147,38 @@ export async function nachweisSpeichern( unterlagen: Unterlage[], ausweisart: Enums.Ausweisart ) { - if (objekt.id) { - await api.objekt._id.PATCH.fetch({ - adresse: objekt.adresse, - latitude: 0, - longitude: 0, - ort: objekt.ort, - plz: objekt.plz - }, { - params: { - id: objekt.id - }, - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) -} else { - const { id } = await api.objekt.PUT.fetch({ - adresse: objekt.adresse, - latitude: 0, - longitude: 0, - ort: objekt.ort, - plz: objekt.plz - }, { - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } + const [objekt_id, objekt_error] = await tryCatch(objektSpeichern(objekt)) + + if (objekt_error) { + addNotification({ + message: "Das hat nicht geklappt.", + subtext: "Beim Speichern des Objektes ist ein Fehler aufgetreten, bitte versuchen sie es erneut." }) - objekt.id = id; + return; } + objekt.id = objekt_id + let [aufnahme_id, aufnahme_error] = await tryCatch(aufnahmeSpeichern(aufnahme, objekt_id)) - if (aufnahme.id) { - await api.aufnahme._id.PATCH.fetch({ - baujahr_gebaeude: aufnahme.baujahr_gebaeude || [], - baujahr_heizung: aufnahme.baujahr_heizung || [], - baujahr_klima: aufnahme.baujahr_klima || [], - alternative_heizung: aufnahme.alternative_heizung, - alternative_kuehlung: aufnahme.alternative_kuehlung, - alternative_lueftung: aufnahme.alternative_lueftung, - alternative_warmwasser: aufnahme.alternative_warmwasser, - aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, - aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, - brennwert_kessel: aufnahme.brennwert_kessel, - dachgeschoss: aufnahme.dachgeschoss, - dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, - dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, - doppel_verglasung: aufnahme.doppel_verglasung, - dreifach_verglasung: aufnahme.dreifach_verglasung, - durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, - einfach_verglasung: aufnahme.einfach_verglasung, - einheiten: aufnahme.einheiten, - einzelofen: aufnahme.einzelofen, - fenster_dicht: aufnahme.fenster_dicht, - fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, - flaeche: aufnahme.flaeche, - gebaeudeteil: aufnahme.gebaeudeteil, - gebaeudetyp: aufnahme.gebaeudetyp, - heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, - isolier_verglasung: aufnahme.isolier_verglasung, - keller: aufnahme.keller, - keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, - keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, - kuehlung: aufnahme.kuehlung, - leerstand: aufnahme.leerstand, - lueftung: aufnahme.lueftung, - niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, - nutzflaeche: aufnahme.nutzflaeche, - oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, - oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, - photovoltaik: aufnahme.photovoltaik, - raum_temperatur_regler: aufnahme.raum_temperatur_regler, - rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, - saniert: aufnahme.saniert, - solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, - standard_kessel: aufnahme.standard_kessel, - tueren_dicht: aufnahme.tueren_dicht, - tueren_undicht: aufnahme.tueren_undicht, - waermepumpe: aufnahme.waermepumpe, - warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, - zentralheizung: aufnahme.zentralheizung, - zirkulation: aufnahme.zirkulation - }, { - params: { - id: aufnahme.id - }, - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) - } else { - const { id } = await api.aufnahme.PUT.fetch({ - aufnahme: { - baujahr_gebaeude: aufnahme.baujahr_gebaeude, - baujahr_heizung: aufnahme.baujahr_heizung, - alternative_heizung: aufnahme.alternative_heizung, - alternative_kuehlung: aufnahme.alternative_kuehlung, - alternative_lueftung: aufnahme.alternative_lueftung, - alternative_warmwasser: aufnahme.alternative_warmwasser, - aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, - aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, - baujahr_klima: aufnahme.baujahr_klima, - brennwert_kessel: aufnahme.brennwert_kessel, - dachgeschoss: aufnahme.dachgeschoss, - dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, - dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, - doppel_verglasung: aufnahme.doppel_verglasung, - dreifach_verglasung: aufnahme.dreifach_verglasung, - durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, - einfach_verglasung: aufnahme.einfach_verglasung, - einheiten: aufnahme.einheiten, - einzelofen: aufnahme.einzelofen, - erstellungsdatum: aufnahme.erstellungsdatum, - fenster_dicht: aufnahme.fenster_dicht, - fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, - flaeche: aufnahme.flaeche, - gebaeudeteil: aufnahme.gebaeudeteil, - gebaeudetyp: aufnahme.gebaeudetyp, - heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, - isolier_verglasung: aufnahme.isolier_verglasung, - keller: aufnahme.keller, - keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, - keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, - kuehlung: aufnahme.kuehlung, - leerstand: aufnahme.leerstand, - lueftung: aufnahme.lueftung, - niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, - nutzflaeche: aufnahme.nutzflaeche, - oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, - oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, - photovoltaik: aufnahme.photovoltaik, - raum_temperatur_regler: aufnahme.raum_temperatur_regler, - rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, - saniert: aufnahme.saniert, - solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, - standard_kessel: aufnahme.standard_kessel, - tueren_dicht: aufnahme.tueren_dicht, - tueren_undicht: aufnahme.tueren_undicht, - waermepumpe: aufnahme.waermepumpe, - warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, - zentralheizung: aufnahme.zentralheizung, - zirkulation: aufnahme.zirkulation - }, - objekt_id: objekt.id - }, { - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } + if (aufnahme_error) { + addNotification({ + message: "Das hat nicht geklappt.", + subtext: "Beim Speichern der Objektaufnahme ist ein Fehler aufgetreten, bitte versuchen sie es erneut." }) - aufnahme.id = id + return; } - let patchRoute: any; - let putRoute: any; + aufnahme.id = aufnahme_id + if (ausweisart == Enums.Ausweisart.GEGNachweisWohnen) { - patchRoute = api["geg-nachweis-wohnen"]._id.PATCH - putRoute = api["geg-nachweis-wohnen"].PUT + gegNachweisWohnenSpeichern(nachweis as GEGNachweisWohnen, aufnahme_id) } else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) { - patchRoute = api["geg-nachweis-gewerbe"]._id.PATCH - putRoute = api["geg-nachweis-gewerbe"].PUT + gegNachweisGewerbeSpeichern(nachweis as GEGNachweisGewerbe, aufnahme_id) } else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { - patchRoute = api["bedarfsausweis-gewerbe"]._id.PATCH - putRoute = api["bedarfsausweis-gewerbe"].PUT - } - - if (nachweis.id) { - await patchRoute.fetch({ - ...exclude(nachweis, ["id"]) - }, { - params: { - id: nachweis.id - }, - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) - } else { - const { id } = await putRoute.fetch({ - nachweis, - aufnahme_id: aufnahme.id - }, { - headers: { - "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` - } - }) - - nachweis.id = id; + bedarfsausweisGewerbeSpeichern(nachweis as BedarfsausweisGewerbe, aufnahme_id) } await api.aufnahme._id.bilder.PUT.fetch(bilder.map(bild => bild.id), { @@ -213,8 +189,6 @@ export async function nachweisSpeichern( "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` } }) - console.log(unterlagen); - await api.aufnahme._id.unterlagen.PUT.fetch(unterlagen.map(unterlage => unterlage.id), { params: { diff --git a/src/client/lib/speichern.ts b/src/client/lib/speichern.ts new file mode 100644 index 00000000..b424785e --- /dev/null +++ b/src/client/lib/speichern.ts @@ -0,0 +1,164 @@ +import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; +import { Aufnahme, Objekt } from "#lib/server/prisma.js"; +import { api } from "astro-typesafe-api/client"; +import Cookies from "js-cookie"; + +export async function aufnahmeSpeichern(aufnahme: Aufnahme, objekt_id: string): Promise { + if (aufnahme.id) { + await api.aufnahme._id.PATCH.fetch({ + baujahr_gebaeude: aufnahme.baujahr_gebaeude || [], + baujahr_heizung: aufnahme.baujahr_heizung || [], + baujahr_klima: aufnahme.baujahr_klima || [], + alternative_heizung: aufnahme.alternative_heizung, + alternative_kuehlung: aufnahme.alternative_kuehlung, + alternative_lueftung: aufnahme.alternative_lueftung, + alternative_warmwasser: aufnahme.alternative_warmwasser, + aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, + aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, + brennwert_kessel: aufnahme.brennwert_kessel, + dachgeschoss: aufnahme.dachgeschoss, + dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, + dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, + doppel_verglasung: aufnahme.doppel_verglasung, + dreifach_verglasung: aufnahme.dreifach_verglasung, + durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, + einfach_verglasung: aufnahme.einfach_verglasung, + einheiten: aufnahme.einheiten, + einzelofen: aufnahme.einzelofen, + fenster_dicht: aufnahme.fenster_dicht, + fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, + flaeche: aufnahme.flaeche, + gebaeudeteil: aufnahme.gebaeudeteil, + gebaeudetyp: aufnahme.gebaeudetyp, + heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, + isolier_verglasung: aufnahme.isolier_verglasung, + keller: aufnahme.keller, + keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, + keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, + kuehlung: aufnahme.kuehlung, + leerstand: aufnahme.leerstand, + lueftung: aufnahme.lueftung, + niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, + nutzflaeche: aufnahme.nutzflaeche, + oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, + oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, + photovoltaik: aufnahme.photovoltaik, + raum_temperatur_regler: aufnahme.raum_temperatur_regler, + rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, + saniert: aufnahme.saniert, + solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, + standard_kessel: aufnahme.standard_kessel, + tueren_dicht: aufnahme.tueren_dicht, + tueren_undicht: aufnahme.tueren_undicht, + waermepumpe: aufnahme.waermepumpe, + warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, + zentralheizung: aufnahme.zentralheizung, + zirkulation: aufnahme.zirkulation + }, { + params: { + id: aufnahme.id + }, + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return aufnahme.id + } else { + const { id } = await api.aufnahme.PUT.fetch({ + aufnahme: { + baujahr_gebaeude: aufnahme.baujahr_gebaeude, + baujahr_heizung: aufnahme.baujahr_heizung, + alternative_heizung: aufnahme.alternative_heizung, + alternative_kuehlung: aufnahme.alternative_kuehlung, + alternative_lueftung: aufnahme.alternative_lueftung, + alternative_warmwasser: aufnahme.alternative_warmwasser, + aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, + aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, + baujahr_klima: aufnahme.baujahr_klima, + brennwert_kessel: aufnahme.brennwert_kessel, + dachgeschoss: aufnahme.dachgeschoss, + dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, + dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, + doppel_verglasung: aufnahme.doppel_verglasung, + dreifach_verglasung: aufnahme.dreifach_verglasung, + durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, + einfach_verglasung: aufnahme.einfach_verglasung, + einheiten: aufnahme.einheiten, + einzelofen: aufnahme.einzelofen, + erstellungsdatum: aufnahme.erstellungsdatum, + fenster_dicht: aufnahme.fenster_dicht, + fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, + flaeche: aufnahme.flaeche, + gebaeudeteil: aufnahme.gebaeudeteil, + gebaeudetyp: aufnahme.gebaeudetyp, + heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, + isolier_verglasung: aufnahme.isolier_verglasung, + keller: aufnahme.keller, + keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, + keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, + kuehlung: aufnahme.kuehlung, + leerstand: aufnahme.leerstand, + lueftung: aufnahme.lueftung, + niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, + nutzflaeche: aufnahme.nutzflaeche, + oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, + oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, + photovoltaik: aufnahme.photovoltaik, + raum_temperatur_regler: aufnahme.raum_temperatur_regler, + rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, + saniert: aufnahme.saniert, + solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, + standard_kessel: aufnahme.standard_kessel, + tueren_dicht: aufnahme.tueren_dicht, + tueren_undicht: aufnahme.tueren_undicht, + waermepumpe: aufnahme.waermepumpe, + warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, + zentralheizung: aufnahme.zentralheizung, + zirkulation: aufnahme.zirkulation + }, + objekt_id + }, { + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return id; + } +} + +export async function objektSpeichern(objekt: Objekt & { id?: string }): Promise { + if (objekt.id) { + await api.objekt._id.PATCH.fetch({ + adresse: objekt.adresse, + latitude: 0, + longitude: 0, + ort: objekt.ort, + plz: objekt.plz + }, { + params: { + id: objekt.id + }, + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return objekt.id; +} else { + const { id } = await api.objekt.PUT.fetch({ + adresse: objekt.adresse, + latitude: 0, + longitude: 0, + ort: objekt.ort, + plz: objekt.plz + }, { + headers: { + "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + return id; + } +} \ No newline at end of file diff --git a/src/components/Ausweis/ButtonWeiterHilfe.svelte b/src/components/Ausweis/ButtonWeiterHilfe.svelte index ee2ee4a1..b119c4bb 100644 --- a/src/components/Ausweis/ButtonWeiterHilfe.svelte +++ b/src/components/Ausweis/ButtonWeiterHilfe.svelte @@ -39,26 +39,39 @@ (form.querySelector("input[name='baujahr_heizung']") as HTMLInputElement).setCustomValidity("") } + new FormData(form).forEach((value, key) => { + if (key === "baujahr_heizung" || key === "baujahr_gebaeude" || key === "baujahr_klima") { + return + } + + const element = (form.querySelector(`[name='${key}']`) as HTMLSelectElement); + if (!value && element.required) { + element.setCustomValidity("Eine Auswahl ist verpflichtend.") + } else { + element.setCustomValidity("") + } + }) + if (!form.checkValidity()) { - // Entferne die Klasse "2xl:mt-[370px]" falls vorhanden - form.classList.remove("2xl:mt-[370px]"); + // Entferne die Klasse "2xl:mt-[370px]" falls vorhanden + form.classList.remove("2xl:mt-[370px]"); - // Verhindere das Scrollen (falls erforderlich) - skala.classList.add("no-scroll"); + // Verhindere das Scrollen (falls erforderlich) + skala.classList.add("no-scroll"); - // Zeige die Validierungsmeldungen - form.reportValidity(); + // Zeige die Validierungsmeldungen + form.reportValidity(); - // Finde das erste ungültige Feld und scrolle sanft darauf - let firstInvalidField = form.querySelector(":invalid"); - if (firstInvalidField) { - let offset = 150; // Abstand für bessere Sichtbarkeit - let fieldPosition = firstInvalidField.getBoundingClientRect().top + window.scrollY; - window.scrollTo({ top: fieldPosition - offset, behavior: "smooth" }); - } + // Finde das erste ungültige Feld und scrolle sanft darauf + let firstInvalidField = form.querySelector(":invalid"); + if (firstInvalidField) { + let offset = 150; // Abstand für bessere Sichtbarkeit + let fieldPosition = firstInvalidField.getBoundingClientRect().top + window.scrollY; + window.scrollTo({ top: fieldPosition - offset, behavior: "smooth" }); + } - return; - } + return; + } if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { openWindowWithPost("/kundendaten", { @@ -97,10 +110,16 @@ let result: Awaited> | Awaited> | null = null; if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { result = await nachweisSpeichern({ ...ausweis as GEGNachweisWohnen, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart) - ausweis.id = result.nachweis_id; + + if (result) { + ausweis.id = result.nachweis_id; + } } else { result = await ausweisSpeichern({ ...ausweis as VerbrauchsausweisWohnen, ausweistyp }, objekt, aufnahme, bilder, ausweisart) - ausweis.id = result.ausweis_id; + + if (result) { + ausweis.id = result.ausweis_id; + } } if (result !== null) { diff --git a/src/modules/KundendatenModule.svelte b/src/modules/KundendatenModule.svelte index a887825c..f92d3c8d 100644 --- a/src/modules/KundendatenModule.svelte +++ b/src/modules/KundendatenModule.svelte @@ -2,7 +2,7 @@ import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte"; import Progressbar from "#components/Ausweis/Progressbar.svelte"; import Bereich from "#components/labels/Bereich.svelte"; - import type { Bezahlmethoden, Unterlage } from "#lib/client/prisma.js"; + import type { BedarfsausweisGewerbe, Bezahlmethoden, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.js"; import { Enums } from "#lib/client/prisma.js"; import { API_ACCESS_TOKEN_COOKIE_NAME, @@ -232,7 +232,7 @@ let result: Awaited> | Awaited> | null = null; try { if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { - result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) + result = await nachweisSpeichern(ausweis as unknown as GEGNachweisWohnen | GEGNachweisGewerbe | BedarfsausweisGewerbe, objekt, aufnahme, bilder, unterlagen, ausweisart) } else { result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart) } diff --git a/src/pages/api/bedarfsausweis-gewerbe/[id].ts b/src/pages/api/bedarfsausweis-gewerbe/[id].ts index 526312af..3103e429 100644 --- a/src/pages/api/bedarfsausweis-gewerbe/[id].ts +++ b/src/pages/api/bedarfsausweis-gewerbe/[id].ts @@ -1,4 +1,6 @@ import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; +import { generatePrefixedId } from "#lib/db.js"; import { exclude } from "#lib/exclude.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { prisma } from "#lib/server/prisma.js"; @@ -8,11 +10,16 @@ import { z } from "zod"; export const PATCH = defineApiRoute({ input: BedarfsausweisGewerbeSchema.omit({ - uid: true, id: true, benutzer_id: true, geg_einpreisung_id: true, aufnahme_id: true, + bestellt: true, + created_at: true, + rechnung_id: true, + storniert: true, + updated_at: true, + zurueckgestellt: true }), output: z.void(), headers: { @@ -22,7 +29,7 @@ export const PATCH = defineApiRoute({ async fetch(input, ctx, user) { const objekt = await prisma.bedarfsausweisGewerbe.findUnique({ where: { - uid: ctx.params.uid, + id: ctx.params.id, benutzer: { id: user.id } @@ -38,7 +45,7 @@ export const PATCH = defineApiRoute({ await prisma.bedarfsausweisGewerbe.update({ where: { - uid: ctx.params.uid + id: ctx.params.id }, data: input }) @@ -52,9 +59,9 @@ export const DELETE = defineApiRoute({ headers: authorizationHeaders, middleware: authorizationMiddleware, async fetch(input, ctx, user) { - const { uid } = ctx.params; + const { id } = ctx.params; - if (!UUidWithPrefix.safeParse(uid).success) { + if (!UUidWithPrefix.safeParse(id).success) { throw new APIError({ code: "BAD_REQUEST", message: "UID konnte nicht verifiziert werden." @@ -65,7 +72,7 @@ export const DELETE = defineApiRoute({ // Dieser MUSS mit dem Nutzer verknüpft sein. const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({ where: { - uid, + id, } }); @@ -112,10 +119,13 @@ export const DELETE = defineApiRoute({ } }) + const event_id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket) + // Wir erstellen ein Event, dass der Nachweis storniert wurde // Dann können wir das in der Historie anzeigen await prisma.event.create({ data: { + id: event_id, title: "Nachweis storniert", description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.", benutzer: { @@ -151,9 +161,9 @@ export const GET = defineApiRoute({ } }, output: BedarfsausweisGewerbeSchema.merge(z.object({ - uid_aufnahme: UUidWithPrefix, - uid_objekt: UUidWithPrefix, - uid_benutzer: UUidWithPrefix.optional() + aufnahme_id: UUidWithPrefix, + objekt_id: UUidWithPrefix, + benutzer_id: UUidWithPrefix.optional() })).omit({ id: true, aufnahme_id: true, @@ -161,9 +171,9 @@ export const GET = defineApiRoute({ }), middleware: authorizationMiddleware, async fetch(input, context, user) { - const { uid } = context.params; + const { id } = context.params; - if (!uid) { + if (!id) { throw new APIError({ code: "BAD_REQUEST", message: "Missing uid in request params" @@ -172,21 +182,21 @@ export const GET = defineApiRoute({ const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({ where: { - uid, + id, benutzer_id: user.id }, include: { benutzer: { select: { - uid: true + id: true } }, aufnahme: { select: { - uid: true, + id: true, objekt: { select: { - uid: true + id: true } } } @@ -203,9 +213,9 @@ export const GET = defineApiRoute({ } return { - uid_aufnahme: nachweis.aufnahme.uid, - uid_objekt: nachweis.aufnahme.objekt.uid, - uid_benutzer: nachweis.benutzer?.uid, + aufnahme_id: nachweis.aufnahme.id, + objekt_id: nachweis.aufnahme.objekt.id, + benutzer_id: nachweis.benutzer?.id, ...exclude(nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"]) } }, diff --git a/src/pages/api/bedarfsausweis-gewerbe/index.ts b/src/pages/api/bedarfsausweis-gewerbe/index.ts index 367a3d4f..92e486cc 100644 --- a/src/pages/api/bedarfsausweis-gewerbe/index.ts +++ b/src/pages/api/bedarfsausweis-gewerbe/index.ts @@ -1,4 +1,6 @@ import { UUidWithPrefix } from "#components/Ausweis/types.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; +import { generatePrefixedId } from "#lib/db.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; @@ -16,24 +18,24 @@ export const PUT = defineApiRoute({ nachweis: BedarfsausweisGewerbeSchema.omit({ id: true, benutzer_id: true, - uid: true, - aufnahme_id: true, geg_einpreisung_id: true, - rechnung_id: true + aufnahme_id: true, + bestellt: true, + created_at: true, + rechnung_id: true, + storniert: true, + updated_at: true, + zurueckgestellt: true }), - uid_aufnahme: UUidWithPrefix - }), - output: z.object({ - uid: UUidWithPrefix, - objekt_uid: UUidWithPrefix, - aufnahme_uid: UUidWithPrefix, + aufnahme_id: UUidWithPrefix }), + output: UUidWithPrefix, headers: authorizationHeaders, middleware: authorizationMiddleware, async fetch(input, ctx, user) { const aufnahme = await prisma.aufnahme.findUnique({ where: { - uid: input.uid_aufnahme + id: input.aufnahme_id } }) @@ -44,8 +46,11 @@ export const PUT = defineApiRoute({ }) } + const id = generatePrefixedId(6, VALID_UUID_PREFIXES.GEGNachweisGewerbe) + const nachweis = await prisma.bedarfsausweisGewerbe.create({ data: { + id, ...input.nachweis, benutzer: { connect: { @@ -57,27 +62,10 @@ export const PUT = defineApiRoute({ id: aufnahme.id, }, } - }, - select: { - uid: true, - aufnahme: { - select: { - uid: true, - objekt: { - select: { - uid: true, - }, - }, - }, - }, - }, + } }); - return { - uid: nachweis.uid, - objekt_uid: nachweis.aufnahme.objekt.uid, - aufnahme_uid: nachweis.aufnahme.uid, - }; + return nachweis.id }, }); @@ -101,11 +89,11 @@ export const GET = defineApiRoute({ headers: authorizationHeaders, middleware: authorizationMiddleware, async fetch(input, context, user) { - const { uid } = context.params; + const { id } = context.params; const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({ where: { - uid, + id, }, include: { benutzer: true, @@ -115,7 +103,7 @@ export const GET = defineApiRoute({ include: { benutzer: { select: { - uid: true, + id: true, }, }, }, diff --git a/src/pages/api/bedarfsausweis-wohnen/[id].ts b/src/pages/api/bedarfsausweis-wohnen/[id].ts index 2737389a..cfdc4b5a 100644 --- a/src/pages/api/bedarfsausweis-wohnen/[id].ts +++ b/src/pages/api/bedarfsausweis-wohnen/[id].ts @@ -1,16 +1,25 @@ import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; +import { generatePrefixedId } from "#lib/db.js"; import { exclude } from "#lib/exclude.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; -import { BedarfsausweisWohnenSchema, prisma, VerbrauchsausweisWohnenSchema } from "#lib/server/prisma"; +import { BedarfsausweisWohnen, prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; +import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js"; import { z } from "zod"; export const PATCH = defineApiRoute({ - input: VerbrauchsausweisWohnenSchema.omit({ - uid: true, + input: BedarfsausweisWohnenSchema.omit({ id: true, benutzer_id: true, aufnahme_id: true, + rechnung_id: true, + ausgestellt: true, + bestellt: true, + zurueckgestellt: true, + created_at: true, + updated_at: true, + storniert: true }), output: z.void(), headers: { @@ -18,9 +27,9 @@ export const PATCH = defineApiRoute({ }, middleware: authorizationMiddleware, async fetch(input, ctx, user) { - const objekt = await prisma.verbrauchsausweisWohnen.findUnique({ + const objekt = await prisma.bedarfsausweisWohnen.findUnique({ where: { - uid: ctx.params.uid, + id: ctx.params.id, benutzer: { id: user.id } @@ -34,9 +43,9 @@ export const PATCH = defineApiRoute({ }) } - await prisma.verbrauchsausweisWohnen.update({ + await prisma.bedarfsausweisWohnen.update({ where: { - uid: ctx.params.uid + id: ctx.params.id }, data: input }) @@ -50,9 +59,9 @@ export const DELETE = defineApiRoute({ headers: authorizationHeaders, middleware: authorizationMiddleware, async fetch(input, ctx, user) { - const { uid } = ctx.params; + const { id } = ctx.params; - if (!UUidWithPrefix.safeParse(uid).success) { + if (!UUidWithPrefix.safeParse(id).success) { throw new APIError({ code: "BAD_REQUEST", message: "UID konnte nicht verifiziert werden." @@ -61,15 +70,11 @@ export const DELETE = defineApiRoute({ // Wir holen uns den Bedarfsausweis // Dieser MUSS mit dem Nutzer verknüpft sein. - const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ + const ausweis = await prisma.bedarfsausweisWohnen.findUnique({ where: { - uid, - }, - include: { - aufnahme: { - select: { - storniert: true - } + id, + benutzer: { + id: user.id } } }); @@ -100,7 +105,7 @@ export const DELETE = defineApiRoute({ // }); // } - if (ausweis.aufnahme.storniert) { + if (ausweis.storniert) { // Falls der Ausweis bereits storniert ist, werfen wir einen Fehler throw new APIError({ code: "BAD_REQUEST", @@ -108,19 +113,22 @@ export const DELETE = defineApiRoute({ }); } - await prisma.aufnahme.update({ + await prisma.bedarfsausweisWohnen.update({ where: { - id: ausweis.aufnahme_id + id }, data: { storniert: true } }) + const event_id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket) + // Wir erstellen ein Event, dass der Ausweis storniert wurde // Dann können wir das in der Historie anzeigen await prisma.event.create({ data: { + id: event_id, title: "Ausweis storniert", description: ((user.rolle === "ADMIN") && (ausweis.benutzer_id !== user.id)) ? "Ausweis wurde von einem Administrator storniert." : "Ausweis wurde vom Besitzer storniert.", benutzer: { @@ -155,10 +163,10 @@ export const GET = defineApiRoute({ } } }, - output: ZodOverlap>(VerbrauchsausweisWohnenSchema.merge(z.object({ - uid_aufnahme: UUidWithPrefix, - uid_objekt: UUidWithPrefix, - uid_benutzer: UUidWithPrefix.optional() + output: ZodOverlap>(BedarfsausweisWohnenSchema.merge(z.object({ + aufnahme_id: UUidWithPrefix, + objekt_id: UUidWithPrefix, + benutzer_id: UUidWithPrefix.optional() })).omit({ id: true, aufnahme_id: true, @@ -166,9 +174,9 @@ export const GET = defineApiRoute({ })), middleware: authorizationMiddleware, async fetch(input, context, user) { - const { uid } = context.params; + const { id } = context.params; - if (!uid) { + if (!id) { throw new APIError({ code: "BAD_REQUEST", message: "Missing uid in request params" @@ -177,21 +185,21 @@ export const GET = defineApiRoute({ const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ where: { - uid, + id, benutzer_id: user.id }, include: { benutzer: { select: { - uid: true + id: true } }, aufnahme: { select: { - uid: true, + id: true, objekt: { select: { - uid: true + id: true } } } @@ -208,9 +216,9 @@ export const GET = defineApiRoute({ } return { - uid_aufnahme: ausweis.aufnahme.uid, - uid_objekt: ausweis.aufnahme.objekt.uid, - uid_benutzer: ausweis.benutzer?.uid, + aufnahme_id: ausweis.aufnahme.id, + objekt_id: ausweis.aufnahme.objekt.id, + benutzer_id: ausweis.benutzer?.id, ...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"]) } }, diff --git a/src/pages/api/bedarfsausweis-wohnen/index.ts b/src/pages/api/bedarfsausweis-wohnen/index.ts index d44b61aa..a45411f4 100644 --- a/src/pages/api/bedarfsausweis-wohnen/index.ts +++ b/src/pages/api/bedarfsausweis-wohnen/index.ts @@ -1,5 +1,10 @@ import { UUidWithPrefix } from "#components/Ausweis/types.js"; -import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; +import { generatePrefixedId } from "#lib/db.js"; +import { + authorizationHeaders, + authorizationMiddleware, +} from "#lib/middleware/authorization.js"; import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js"; @@ -16,66 +21,58 @@ export const PUT = defineApiRoute({ ausweis: BedarfsausweisWohnenSchema.omit({ id: true, benutzer_id: true, - uid: true, - aufnahme_id: true + aufnahme_id: true, + rechnung_id: true, + ausgestellt: true, + bestellt: true, + zurueckgestellt: true, + created_at: true, + updated_at: true, + storniert: true, }), - uid_aufnahme: UUidWithPrefix - }), - output: z.object({ - uid: UUidWithPrefix, - objekt_uid: UUidWithPrefix, - aufnahme_uid: UUidWithPrefix, + aufnahme_id: UUidWithPrefix, }), + output: UUidWithPrefix, headers: authorizationHeaders, middleware: authorizationMiddleware, async fetch(input, ctx, user) { const aufnahme = await prisma.aufnahme.findUnique({ where: { - uid: input.uid_aufnahme - } - }) + id: input.aufnahme_id, + }, + }); if (!aufnahme || aufnahme.benutzer_id !== user.id) { throw new APIError({ code: "FORBIDDEN", - message: "Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer." - }) + message: + "Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer.", + }); } - const createdAusweis = await prisma.bedarfsausweisWohnen.create({ - data: { - ...input.ausweis, - benutzer: { - connect: { - id: user.id, - }, - }, - aufnahme: { - connect: { - uid: aufnahme.uid, - }, - }, - }, - select: { - uid: true, - aufnahme: { - select: { - uid: true, - objekt: { - select: { - uid: true, - }, - }, - }, - }, - }, - }); + const id = generatePrefixedId( + 6, + VALID_UUID_PREFIXES.BedarfsausweisWohnen + ); - return { - uid: createdAusweis.uid, - objekt_uid: createdAusweis.aufnahme.objekt.uid, - aufnahme_uid: createdAusweis.aufnahme.uid, - }; + await prisma.bedarfsausweisWohnen.create({ + data: { + id, + ...input.ausweis, + benutzer: { + connect: { + id: user.id, + }, + }, + aufnahme: { + connect: { + id: aufnahme.id, + }, + }, + }, + }); + + return id; }, }); @@ -98,27 +95,22 @@ export const GET = defineApiRoute({ }, middleware: authorizationMiddleware, async fetch(input, context, user) { - const { uid } = context.params; + const { id } = context.params; const ausweis = await prisma.bedarfsausweisWohnen.findUnique({ where: { - uid, + id, }, include: { benutzer: true, aufnahme: { include: { - objekt: { - include: { - bilder: true, - }, - }, - rechnungen: true, + bilder: true, events: { include: { benutzer: { select: { - uid: true, + id: true, }, }, }, diff --git a/src/pages/api/geg-nachweis-gewerbe/[id].ts b/src/pages/api/geg-nachweis-gewerbe/[id].ts index bfd8cba1..758b5c69 100644 --- a/src/pages/api/geg-nachweis-gewerbe/[id].ts +++ b/src/pages/api/geg-nachweis-gewerbe/[id].ts @@ -1,17 +1,25 @@ import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; +import { generatePrefixedId } from "#lib/db.js"; import { exclude } from "#lib/exclude.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; -import { GEGNachweisGewerbeSchema, GEGNachweisWohnenSchema, prisma } from "#lib/server/prisma"; +import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; +import { GEGNachweisGewerbeSchema } from "src/generated/zod/gegnachweisgewerbe.js"; import { z } from "zod"; export const PATCH = defineApiRoute({ input: GEGNachweisGewerbeSchema.omit({ - uid: true, id: true, benutzer_id: true, + geg_einpreisung_id: true, aufnahme_id: true, - geg_einpreisung_id: true + bestellt: true, + created_at: true, + rechnung_id: true, + storniert: true, + updated_at: true, + zurueckgestellt: true }), output: z.void(), headers: { @@ -21,7 +29,7 @@ export const PATCH = defineApiRoute({ async fetch(input, ctx, user) { const objekt = await prisma.gEGNachweisGewerbe.findUnique({ where: { - uid: ctx.params.uid, + id: ctx.params.id, benutzer: { id: user.id } @@ -37,7 +45,7 @@ export const PATCH = defineApiRoute({ await prisma.gEGNachweisGewerbe.update({ where: { - uid: ctx.params.uid + id: ctx.params.id }, data: input }) @@ -51,9 +59,9 @@ export const DELETE = defineApiRoute({ headers: authorizationHeaders, middleware: authorizationMiddleware, async fetch(input, ctx, user) { - const { uid } = ctx.params; + const { id } = ctx.params; - if (!UUidWithPrefix.safeParse(uid).success) { + if (!UUidWithPrefix.safeParse(id).success) { throw new APIError({ code: "BAD_REQUEST", message: "UID konnte nicht verifiziert werden." @@ -64,7 +72,7 @@ export const DELETE = defineApiRoute({ // Dieser MUSS mit dem Nutzer verknüpft sein. const nachweis = await prisma.gEGNachweisGewerbe.findUnique({ where: { - uid, + id, } }); @@ -111,10 +119,13 @@ export const DELETE = defineApiRoute({ } }) + + const event_id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket) // Wir erstellen ein Event, dass der Nachweis storniert wurde // Dann können wir das in der Historie anzeigen await prisma.event.create({ data: { + id: event_id, title: "Nachweis storniert", description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.", benutzer: { @@ -150,9 +161,9 @@ export const GET = defineApiRoute({ } }, output: GEGNachweisGewerbeSchema.merge(z.object({ - uid_aufnahme: UUidWithPrefix, - uid_objekt: UUidWithPrefix, - uid_benutzer: UUidWithPrefix.optional() + aufnahme_id: UUidWithPrefix, + objekt_id: UUidWithPrefix, + benutzer_id: UUidWithPrefix.optional() })).omit({ id: true, aufnahme_id: true, @@ -160,9 +171,9 @@ export const GET = defineApiRoute({ }), middleware: authorizationMiddleware, async fetch(input, context, user) { - const { uid } = context.params; + const { id } = context.params; - if (!uid) { + if (!id) { throw new APIError({ code: "BAD_REQUEST", message: "Missing uid in request params" @@ -171,21 +182,21 @@ export const GET = defineApiRoute({ const nachweis = await prisma.gEGNachweisGewerbe.findUnique({ where: { - uid, + id, benutzer_id: user.id }, include: { benutzer: { select: { - uid: true + id: true } }, aufnahme: { select: { - uid: true, + id: true, objekt: { select: { - uid: true + id: true } } } @@ -202,9 +213,9 @@ export const GET = defineApiRoute({ } return { - uid_aufnahme: nachweis.aufnahme.uid, - uid_objekt: nachweis.aufnahme.objekt.uid, - uid_benutzer: nachweis.benutzer?.uid, + aufnahme_id: nachweis.aufnahme.id, + objekt_id: nachweis.aufnahme.objekt.id, + benutzer_id: nachweis.benutzer?.id, ...exclude(nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"]) } }, diff --git a/src/pages/api/geg-nachweis-gewerbe/index.ts b/src/pages/api/geg-nachweis-gewerbe/index.ts index f0e441d1..5984bbc8 100644 --- a/src/pages/api/geg-nachweis-gewerbe/index.ts +++ b/src/pages/api/geg-nachweis-gewerbe/index.ts @@ -18,11 +18,14 @@ export const PUT = defineApiRoute({ nachweis: GEGNachweisGewerbeSchema.omit({ id: true, benutzer_id: true, - aufnahme_id: true, - created_at: true, - updated_at: true, geg_einpreisung_id: true, - rechnung_id: true + aufnahme_id: true, + bestellt: true, + created_at: true, + rechnung_id: true, + storniert: true, + updated_at: true, + zurueckgestellt: true }), aufnahme_id: UUidWithPrefix }), diff --git a/src/pages/api/geg-nachweis-wohnen/[id].ts b/src/pages/api/geg-nachweis-wohnen/[id].ts index 05b95b6b..7291e0de 100644 --- a/src/pages/api/geg-nachweis-wohnen/[id].ts +++ b/src/pages/api/geg-nachweis-wohnen/[id].ts @@ -14,6 +14,12 @@ export const PATCH = defineApiRoute({ benutzer_id: true, geg_einpreisung_id: true, aufnahme_id: true, + bestellt: true, + created_at: true, + rechnung_id: true, + storniert: true, + updated_at: true, + zurueckgestellt: true }), output: z.void(), headers: { diff --git a/src/pages/api/geg-nachweis-wohnen/index.ts b/src/pages/api/geg-nachweis-wohnen/index.ts index f164233a..d7594d2b 100644 --- a/src/pages/api/geg-nachweis-wohnen/index.ts +++ b/src/pages/api/geg-nachweis-wohnen/index.ts @@ -18,11 +18,14 @@ export const PUT = defineApiRoute({ nachweis: GEGNachweisWohnenSchema.omit({ id: true, benutzer_id: true, - aufnahme_id: true, - updated_at: true, - created_at: true, geg_einpreisung_id: true, - rechnung_id: true + aufnahme_id: true, + bestellt: true, + created_at: true, + rechnung_id: true, + storniert: true, + updated_at: true, + zurueckgestellt: true }), aufnahme_id: UUidWithPrefix }),