From 009e1a8cada35dda67890bd909c9115cdbccbac1 Mon Sep 17 00:00:00 2001 From: Jens Cornelsen <79703163+IB-Cornelsen@users.noreply.github.com> Date: Sun, 6 Apr 2025 00:35:52 +0200 Subject: [PATCH 1/3] =?UTF-8?q?Best=C3=A4tigungsbox=20vor=20Bestellung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/KundendatenModule.svelte | 133 +++++++++++++++++++++++++++ src/pages/impressum/index.astro | 2 +- 2 files changed, 134 insertions(+), 1 deletion(-) diff --git a/src/modules/KundendatenModule.svelte b/src/modules/KundendatenModule.svelte index 33c33020..b255948c 100644 --- a/src/modules/KundendatenModule.svelte +++ b/src/modules/KundendatenModule.svelte @@ -899,6 +899,129 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center" {/if} + +
+
+

Bitte untenstehende Punkte bestätigen. Bitte gehen Sie gegebenenfalls zurück zum Formular und überprüfen bzw. korrigieren Ihre Eingaben.

+ + +
+ +
+ Das Heizungsalter ist jünger als 3 Jahre. Es handelt sich hier um einen Heizungstausch ohne energetische Verbesserung. +
+
+ +
+ +
+ Die Angabe der Wohnfläche ist korrekt und bezieht sich auf das gesamte Gebäude. +
+
+ +
+ +
+ Ich habe meine Postleitzahl überprüft und bestätige hiermit die Richtigkeit. +
+
+ +
+ +
+ Das Baujahr der Heizungsanlage ist kleiner als das Baujahr des Gebäudes und befründet. +
+
+ +
+ +
+ Die eingegebenen Heizverbräuche sind korrekt und alle 3 Felder wurden vollständig eingegeben. +
+
+ +
+ +
+ Die eingegebenen Heizverbräuche sind korrekt und die Abweichung bei den Verbrauchsjahren lässt sich begründen. Falls es Leerstand gab, wurde + dieser im Formular von mir angegeben. +
+
+ +
+ +
+ Die eingegebenen Stromverbräuche sind korrekt und alle 3 Felder wurden vollständig eingegeben. +
+
+ +
+ +
+ Die eingegebenen Stromverbräuche sind korrekt und die Abweichung bei den Verbrauchsjahren lässt sich begründen. Falls es Leerstand gab, wurde + dieser im Formular von mir angegeben. +
+
+ + +
+ +
+ Ich habe die Verbrauchsangaben nochmal kontrolliert. Der ungewöhnlich niedrige Energiekennwert ist korrekt, da es sich um ein besonders effizientes Gebäude mit z.B. Wärmepumpe handelt. +
+
+ + +
+ +
+ Ich habe die Verbrauchsangaben nochmal kontrolliert. Der ungewöhnlich hohe Energiekennwert ist korrekt, da es sich um ein sehr altes ungedämmtes Gebäude mit z.B. Einfachverglasung handelt. +
+
+ +
+ +
+ Ich habe den Warmwasseranteil nochmal überprüft. Dieser ist korrekt und begründet. +
+
+ +
+ +
+ Ich habe die Wohnfläche nochmal überprüft und bestätige die Richtigkeit. Es handelt sich lediglich um die Wohnfläche innerhalb des Gebäudes. Flächen von eventuell vorhandenen Terassen und Balkonen wurden nicht mitgezählt. +
+
+ +
+ +
+ Ich habe die Angaben zur Gebäudegeometrie geprüft und bestätige die Richtigkeit. +
+
+ +
+ +
+ Ich habe die Angaben zu den Fensterflächen geprüft und bestätige die Richtigkeit. +
+
+ +
+ +
+ Ich habe die AGB und DSGVO im Impressum gelesen und akzeptiert. +
+
+ +
+
+ +
diff --git a/src/pages/impressum/index.astro b/src/pages/impressum/index.astro index 80798604..1a9a9311 100644 --- a/src/pages/impressum/index.astro +++ b/src/pages/impressum/index.astro @@ -44,7 +44,7 @@ import Layout from "#layouts/Layout.astro";
-

Allgemeine Geschäftsbedingungen

+

Allgemeine Geschäftsbedingungen

Stand 01.09.2018


§1 Geltungsbereich

Für die Geschäftsbeziehung zwischen Dipl-Ing. (FH) Jens Cornelsen, Katendeich 5A, 21035 Hamburg (im folgendem Ingenieurbüro) und dem Besteller gelten ausschließlich die nachfolgenden Allgemeinen Geschäftsbedingungen in der Fassung, wie sie zum Zeitpunkt der Bestellung gültig war. Angebote, Lieferungen und Leistungen des Ingenieurbüros erfolgen ausschließlich aufgrund dieser Allgemeinen Geschäftsbedingungen. Spätestens mit der Entgegennahme der Ware oder Leistung durch den Besteller gelten diese Bedingungen als angenommen.​Abweichende Vereinbarungen bedürfen der ausdrücklichen schriftlichen Zustim- mung. -- 2.49.1 From 074ee8b463b43cf3b19142c0ace821a299ce7003 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Sat, 5 Apr 2025 22:35:08 -0300 Subject: [PATCH 2/3] 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 -- 2.49.1 From 0b893200079db7dead6d7569752e9783c0701b43 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Sun, 6 Apr 2025 10:42:36 -0400 Subject: [PATCH 3/3] 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 }), -- 2.49.1