From 2a302a4b59515d37da848ca6c11dc78a9c3e5b0b Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 18:37:39 -0400 Subject: [PATCH 01/23] astro-typesafe-api-caller entfernt --- src/astro-typesafe-api-caller.ts | 45 -------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 src/astro-typesafe-api-caller.ts diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts deleted file mode 100644 index 193bd05d..00000000 --- a/src/astro-typesafe-api-caller.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { createCallerFactory } from "astro-typesafe-api/server"; - -export const createCaller = createCallerFactory({ - "bild": await import("../src/pages/api/bild.ts"), - "klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"), - "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), - "unterlage": await import("../src/pages/api/unterlage.ts"), - "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"), - "admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"), - "admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"), - "admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"), - "admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"), - "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), - "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), - "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), - "auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"), - "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), - "ausweise": await import("../src/pages/api/ausweise/index.ts"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), - "bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"), - "bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"), - "bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"), - "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), - "bilder/[id]": await import("../src/pages/api/bilder/[id].ts"), - "geg-nachweis-gewerbe/[id]": await import("../src/pages/api/geg-nachweis-gewerbe/[id].ts"), - "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"), - "geg-nachweis-wohnen/[id]": await import("../src/pages/api/geg-nachweis-wohnen/[id].ts"), - "geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"), - "objekt": await import("../src/pages/api/objekt/index.ts"), - "rechnung/[id]": await import("../src/pages/api/rechnung/[id].ts"), - "rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"), - "rechnung": await import("../src/pages/api/rechnung/index.ts"), - "ticket": await import("../src/pages/api/ticket/index.ts"), - "user": await import("../src/pages/api/user/index.ts"), - "user/self": await import("../src/pages/api/user/self.ts"), - "verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"), - "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), - "verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"), - "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), - "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), - "aufnahme/[id]/bilder": await import("../src/pages/api/aufnahme/[id]/bilder.ts"), - "aufnahme/[id]": await import("../src/pages/api/aufnahme/[id]/index.ts"), - "aufnahme/[id]/unterlagen": await import("../src/pages/api/aufnahme/[id]/unterlagen.ts"), - "objekt/[id]": await import("../src/pages/api/objekt/[id]/index.ts"), -}) \ No newline at end of file -- 2.49.1 From c0d4ede483082f7721c9ea633b05979837276451 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 18:45:33 -0400 Subject: [PATCH 02/23] Daten Umziehen --- src/pages/api/bedarfsausweis-wohnen/index.ts | 2 +- src/testing/daten-umziehen.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pages/api/bedarfsausweis-wohnen/index.ts b/src/pages/api/bedarfsausweis-wohnen/index.ts index a45411f4..03c26b43 100644 --- a/src/pages/api/bedarfsausweis-wohnen/index.ts +++ b/src/pages/api/bedarfsausweis-wohnen/index.ts @@ -51,7 +51,7 @@ export const PUT = defineApiRoute({ } const id = generatePrefixedId( - 6, + 9, VALID_UUID_PREFIXES.BedarfsausweisWohnen ); diff --git a/src/testing/daten-umziehen.ts b/src/testing/daten-umziehen.ts index 30ecb490..915d2f40 100644 --- a/src/testing/daten-umziehen.ts +++ b/src/testing/daten-umziehen.ts @@ -138,11 +138,11 @@ Papa.parse(file, { } const aufnahme_id = generatePrefixedId( - 6, + 9, VALID_UUID_PREFIXES.Aufnahme ); - const aufnahme = await prisma.aufnahme.create({ + const [aufnahme, aufnahme_error] = await tryCatch(prisma.aufnahme.create({ data: { id: aufnahme_id, alternative_heizung: dataset.alheizung == "1", @@ -243,7 +243,12 @@ Papa.parse(file, { zentralheizung: dataset.zentralheizung == "1", zirkulation: dataset.zirkulation == "1", }, - }); + })); + + if (aufnahme_error) { + console.log(aufnahme_error); + continue; + } /* -------------------------------- Bilder ------------------------------- */ try { -- 2.49.1 From ecdce5b27910cd4d75d478d2a796fbdd9504c3c5 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 18:46:28 -0400 Subject: [PATCH 03/23] Suche --- src/pages/dashboard/objekte/[page].astro | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/dashboard/objekte/[page].astro b/src/pages/dashboard/objekte/[page].astro index 5baa2df3..ec2ad7a6 100644 --- a/src/pages/dashboard/objekte/[page].astro +++ b/src/pages/dashboard/objekte/[page].astro @@ -43,7 +43,9 @@ const objekte = await prisma.objekt.findMany({ every: { verbrauchsausweise_gewerbe: { some: { - id + id: { + contains: id + } } }, } @@ -54,7 +56,9 @@ const objekte = await prisma.objekt.findMany({ every: { verbrauchsausweise_wohnen: { some: { - id + id: { + contains: id + } } }, } @@ -65,7 +69,9 @@ const objekte = await prisma.objekt.findMany({ every: { bedarfsausweise_wohnen: { some: { - id + id: { + contains: id + } } }, } -- 2.49.1 From 145bf46ee13bf3a48ab445a41ea675909449214c Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 20:36:47 -0400 Subject: [PATCH 04/23] Partner Code --- .../Dashboard/DashboardAusweis.svelte | 6 +- .../Dashboard/DashboardObjekt.svelte | 13 -- .../BedarfsausweisWohnenModule.svelte | 4 + .../Dashboard/DashboardAusweiseModule.svelte | 83 ------------ src/modules/KundendatenModule.svelte | 4 +- .../VerbrauchsausweisGewerbeModule.svelte | 3 + .../VerbrauchsausweisWohnenModule.svelte | 1 + .../bedarfsausweis-wohngebaeude/index.astro | 123 +++++++++--------- .../verbrauchsausweis-gewerbe/index.astro | 119 ++++++++--------- .../index.astro | 120 ++++++++--------- src/pages/api/rechnung/anfordern.ts | 3 - src/pages/dashboard/ausweise/index.astro | 21 --- .../bedarfsausweis-wohngebaeude/index.astro | 2 +- .../verbrauchsausweis-gewerbe/index.astro | 2 +- .../index.astro | 5 +- 15 files changed, 205 insertions(+), 304 deletions(-) delete mode 100644 src/modules/Dashboard/DashboardAusweiseModule.svelte delete mode 100644 src/pages/dashboard/ausweise/index.astro diff --git a/src/components/Dashboard/DashboardAusweis.svelte b/src/components/Dashboard/DashboardAusweis.svelte index b39ffd98..2e1e09fe 100644 --- a/src/components/Dashboard/DashboardAusweis.svelte +++ b/src/components/Dashboard/DashboardAusweis.svelte @@ -227,7 +227,11 @@ {:else if ausweis.bestellt} Bestellt {:else} - Gespeichert + {#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe} + Gespeichert + {:else} + Angefordert + {/if} {/if}
{objekt.adresse}
diff --git a/src/components/Dashboard/DashboardObjekt.svelte b/src/components/Dashboard/DashboardObjekt.svelte index 4f3937b7..565b7fdd 100644 --- a/src/components/Dashboard/DashboardObjekt.svelte +++ b/src/components/Dashboard/DashboardObjekt.svelte @@ -47,19 +47,6 @@
Energieausweis
{/if} - {#if objekt.aufnahmen.at(-1)?.bedarfsausweise_wohnen.length} - {@const ausweis = objekt.aufnahmen.at(-1)?.bedarfsausweise_wohnen.at(-1)} - -
- {#if ausweis?.ausgestellt} - Energieausweis ausgestellt - {:else} - Energieausweis ausgestellt - {/if} -
-
Energieausweis
-
- {/if}
{#each objekt.aufnahmen as aufnahme} diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index 2a1202fd..1c1a25e4 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -36,6 +36,8 @@ export let unterlagen: Unterlage[] = []; export let id: string | null; + export let partner_code: string; + export let loadFromDatabase: boolean = false; // Wir holen die daten aus dem LocalStorage falls @@ -143,6 +145,7 @@ bind:unterlagen bind:blockLocalStorageSync {ausweisart} + {partner_code} showWeiter={false} {form} {skala} @@ -277,6 +280,7 @@ bind:unterlagen bind:blockLocalStorageSync {ausweisart} + {partner_code} showWeiter={true} {form} {skala} diff --git a/src/modules/Dashboard/DashboardAusweiseModule.svelte b/src/modules/Dashboard/DashboardAusweiseModule.svelte deleted file mode 100644 index cb4070f5..00000000 --- a/src/modules/Dashboard/DashboardAusweiseModule.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - -{#if errorCount > 0} -

Wichtiges

- -
- {#each ausweisUeberpruefung as { errors }} - {#if errors.length > 0} -
-
-
{errors[0].severity == "error" ? "Achtung!" : "Wichtig!"}
-

{errors[0].title}

-

{errors[0].description}

- {#if errors[0].resolvehref} -
- Beheben -
- {/if} -
-
- {/if} - {/each} -
-{/if} - -

Ihre Ausweise

- -
- - {#if ausweise === null} - - {:else} - {#if ausweise.length == 0} -
-

Es konnten keine Ausweise gefunden werden.

-

Erstellen sie einen Verbrauchsausweis für ihr Wohngebäude hier

-
- {:else} - {#each ausweise as ausweis, i} - - {/each} - {/if} - {/if} - -
- -
-
- - - - -
-
\ No newline at end of file diff --git a/src/modules/KundendatenModule.svelte b/src/modules/KundendatenModule.svelte index 30e3e76a..d0944afb 100644 --- a/src/modules/KundendatenModule.svelte +++ b/src/modules/KundendatenModule.svelte @@ -211,7 +211,7 @@ versand_plz: versand_plz, versand_ort: versand_ort, telefon: telefon, - nachweis_id: result.nachweis_id, + nachweis_id: result.nachweis_id }, { headers: { @@ -291,7 +291,7 @@ let result: Awaited> | Awaited> | null = null; 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, objekt, aufnahme, bilder, unterlagen, ausweisart) } else { result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) } diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte index e4ea4a8b..22bfb6de 100644 --- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte +++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte @@ -49,6 +49,7 @@ export let bilder: BildClient[]; export let id: string | null; + export let partner_code: string; export let loadFromDatabase: boolean = false; const ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe @@ -128,6 +129,7 @@ ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} showWeiter={false} {form} + {partner_code} {skala} > @@ -244,6 +246,7 @@ ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} showWeiter={true} {form} + {partner_code} {skala} > diff --git a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte index 2e546118..0e2f0f4e 100644 --- a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte +++ b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte @@ -160,6 +160,7 @@ let skala: HTMLDivElement; bind:aufnahme ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen} showWeiter={false} + {partner_code} {form} {skala} > diff --git a/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro b/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro index d4373c1d..929beaf4 100644 --- a/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro +++ b/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro @@ -1,84 +1,91 @@ --- -import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro"; + +import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte"; -import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisWohnenClient } 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 { Enums } from "#lib/server/prisma"; +import { Aufnahme, BedarfsausweisWohnen, Bild, Enums, Objekt } from "#lib/server/prisma"; +import { getAufnahme, getObjekt, getBilder, getBedarfsausweisWohnen } 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 ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient; -let aufnahme: AufnahmeClient = {} as AufnahmeClient; -let objekt: ObjektClient = {} as ObjektClient; -let bilder: BildClient[] = [] +let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard; +const partner_code = Astro.params.partner as string; -const valid = validateAccessTokenServer(Astro); +let ausweis: BedarfsausweisWohnen = {} as BedarfsausweisWohnen; +let aufnahme: Aufnahme = {} as Aufnahme; +let objekt: Objekt = {} as Objekt; +let bilder: Bild[] = [] -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 { - ausweis = await caller["bedarfsausweis-wohnen"]._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id - } - }); + ausweis = await getBedarfsausweisWohnen(id) as BedarfsausweisWohnen + ausweistyp = ausweis.ausweistyp; - aufnahme = await caller.aufnahme._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: ausweis.aufnahme_id - } - }) + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { + // Der Ausweis scheint nicht zu existieren. + // Wir leiten auf die generische Ausweisseite ohne ID weiter. + return Astro.redirect( + "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" + ); + } - objekt = await caller.objekt._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: ausweis.objekt_id - } - }) + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme - bilder = await caller.aufnahme._id.bilder.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: ausweis.aufnahme_id - } - }) + if (!aufnahme) { + // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" + ); + } - if (!ausweis) { - // Der Ausweis scheint nicht zu existieren. - // Wir leiten auf die generische Ausweisseite ohne UID weiter. - return Astro.redirect( - "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" - ); - } - } catch(e) { + 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/bedarfsausweis-wohngebaeude" + ); + } + + bilder = await getBilder(aufnahme.id); +} else if (aufnahme_id) { + if (!user) { + return Astro.redirect( + `/auth/login?redirect=${Astro.url.toString()}` + ); + } + + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme + + if (!aufnahme) { + // Die Aufnahme existiert wohl nicht. + return Astro.redirect( + "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" + ); + } + + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht. return Astro.redirect( "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" ); } } +console.log(ausweistyp); + + --- - - + + \ No newline at end of file diff --git a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro index 90793f9d..190b9acc 100644 --- a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro +++ b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro @@ -1,79 +1,80 @@ --- -import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro"; -import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types"; -import { createCaller } from "src/astro-typesafe-api-caller"; -import { inferOutput } from "astro-typesafe-api/client"; -import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; -import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; +import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; +import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types"; 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 uid = Astro.url.searchParams.get("uid"); -const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard; +const id = Astro.url.searchParams.get("id"); +const aufnahme_id = Astro.url.searchParams.get("aufnahme") +let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard; +const partner_code = Astro.params.partner as string; let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient; let objekt: ObjektClient = {} as ObjektClient; -let bilder: UploadedGebaeudeBild[] = [] +let bilder: BildClient[] = [] -const valid = validateAccessTokenServer(Astro); +const user = await getCurrentUser(Astro) -const caller = createCaller(Astro); - -if (uid) { - if (!valid) { +if (id) { + if (!user) { return Astro.redirect( `/auth/login?redirect=${Astro.url.toString()}` ); } - try { - let { uid_aufnahme, uid_objekt, uid_benutzer, ...result } = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid - } - }); + ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe + ausweistyp = ausweis.ausweistyp; - ausweis = result + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { + // Der Ausweis scheint nicht zu existieren. + // Wir leiten auf die generische Ausweisseite ohne ID weiter. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } - aufnahme = await caller.aufnahme._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: uid_aufnahme - } - }) + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme - objekt = await caller.objekt._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: uid_objekt - } - }) + if (!aufnahme) { + // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } - bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: uid_aufnahme - } - }) + objekt = await getObjekt(aufnahme.objekt_id) as Objekt - 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 (!objekt) { + // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } + + bilder = await getBilder(aufnahme.id); +} else if (aufnahme_id) { + if (!user) { + return Astro.redirect( + `/auth/login?redirect=${Astro.url.toString()}` + ); + } + + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme + + if (!aufnahme) { + // Die Aufnahme existiert wohl nicht. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } + + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht. return Astro.redirect( "/energieausweis-erstellen/verbrauchsausweis-gewerbe" ); @@ -81,6 +82,6 @@ if (uid) { } --- - - + + \ No newline at end of file diff --git a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro index a0b1cf47..467385b4 100644 --- a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro +++ b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro @@ -1,77 +1,79 @@ --- import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro"; import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte"; -import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } 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 { Enums } from "#lib/server/prisma"; +import { Aufnahme, Bild, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/server/prisma"; +import { getVerbrauchsausweisWohnen, getAufnahme, getObjekt, getBilder } from "#lib/server/db"; +import { getCurrentUser } from "#lib/server/user"; -const uid = Astro.url.searchParams.get("uid"); -const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard; +const id = Astro.url.searchParams.get("id"); +const aufnahme_id = Astro.url.searchParams.get("aufnahme") +let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard; +const partner_code = Astro.params.partner as string; +let ausweis: VerbrauchsausweisWohnen = {} as VerbrauchsausweisWohnen; +let aufnahme: Aufnahme = {} as Aufnahme; +let objekt: Objekt = {} as Objekt; +let bilder: Bild[] = [] -let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient; -let aufnahme: AufnahmeClient = {} as AufnahmeClient; -let objekt: ObjektClient = {} as ObjektClient; -let bilder: UploadedGebaeudeBild[] = [] +const user = await getCurrentUser(Astro) -const valid = validateAccessTokenServer(Astro); - -const caller = createCaller(Astro); - -if (uid) { - if (!valid) { +if (id) { + if (!user) { return Astro.redirect( `/auth/login?redirect=${Astro.url.toString()}` ); } - try { - ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid - } - }); + ausweis = await getVerbrauchsausweisWohnen(id) as VerbrauchsausweisWohnen + ausweistyp = ausweis.ausweistyp; - aufnahme = await caller.aufnahme._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: ausweis.uid_aufnahme - } - }) + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { + // Der Ausweis scheint nicht zu existieren. + // Wir leiten auf die generische Ausweisseite ohne ID weiter. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } - objekt = await caller.objekt._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: ausweis.uid_objekt - } - }) + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme - bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: ausweis.uid_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" + ); + } - if (!ausweis) { - // Der Ausweis scheint nicht zu existieren. - // Wir leiten auf die generische Ausweisseite ohne UID weiter. - return Astro.redirect( - "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" - ); - } - } catch(e) { + 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 (!user) { + return Astro.redirect( + `/auth/login?redirect=${Astro.url.toString()}` + ); + } + + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme + + if (!aufnahme) { + // Die Aufnahme existiert wohl nicht. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } + + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht. return Astro.redirect( "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" ); @@ -81,5 +83,5 @@ if (uid) { --- - + diff --git a/src/pages/api/rechnung/anfordern.ts b/src/pages/api/rechnung/anfordern.ts index ffe543a4..ba1a21cf 100644 --- a/src/pages/api/rechnung/anfordern.ts +++ b/src/pages/api/rechnung/anfordern.ts @@ -51,9 +51,6 @@ export const PUT = defineApiRoute({ "message": `Ausweisart wird nicht unterstützt: ${ausweisart}` }) } - - console.log(nachweis); - if (!nachweis || nachweis.benutzer_id !== user.id) { throw new APIError({ diff --git a/src/pages/dashboard/ausweise/index.astro b/src/pages/dashboard/ausweise/index.astro deleted file mode 100644 index 4a49e830..00000000 --- a/src/pages/dashboard/ausweise/index.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import UserLayout from "#layouts/DashboardLayout.astro"; -import DashboardAusweiseModule from "#modules/Dashboard/DashboardAusweiseModule.svelte"; - -import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; -import { createCaller } from "src/astro-typesafe-api-caller"; - -const accessTokenValid = await validateAccessTokenServer(Astro); - -if (!accessTokenValid) { - return Astro.redirect("/auth/login") -} - -const caller = createCaller(Astro); - -const user = await caller.v1.benutzer.self(); ---- - - - - \ No newline at end of file diff --git a/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro b/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro index d5280bea..77528d1e 100644 --- a/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro +++ b/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro @@ -27,7 +27,7 @@ if (id) { ausweis = await getBedarfsausweisWohnen(id) as BedarfsausweisWohnen ausweistyp = ausweis.ausweistyp; - if (!ausweis || ausweis.benutzer_id !== user.id) { + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { // Der Ausweis scheint nicht zu existieren. // Wir leiten auf die generische Ausweisseite ohne ID weiter. return Astro.redirect( diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro index ebc5b35c..744699cc 100644 --- a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro +++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro @@ -27,7 +27,7 @@ if (id) { ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe ausweistyp = ausweis.ausweistyp; - if (!ausweis || ausweis.benutzer_id !== user.id) { + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { // Der Ausweis scheint nicht zu existieren. // Wir leiten auf die generische Ausweisseite ohne ID weiter. return Astro.redirect( diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro index d2bb033c..3923b2b0 100644 --- a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro +++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro @@ -1,7 +1,6 @@ --- import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte"; -import { AufnahmeClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; import { Aufnahme, Bild, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/server/prisma"; import { getAufnahme, getBilder, getObjekt, getVerbrauchsausweisWohnen } from "#lib/server/db"; import { getCurrentUser } from "#lib/server/user"; @@ -27,7 +26,7 @@ if (id) { ausweis = await getVerbrauchsausweisWohnen(id) as VerbrauchsausweisWohnen ausweistyp = ausweis.ausweistyp; - if (!ausweis || ausweis.benutzer_id !== user.id) { + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { // Der Ausweis scheint nicht zu existieren. // Wir leiten auf die generische Ausweisseite ohne ID weiter. return Astro.redirect( @@ -82,5 +81,5 @@ if (id) { --- - + -- 2.49.1 From ba7792a4b9949cdbad963150c1ec7b669d9c03b1 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 21:27:38 -0400 Subject: [PATCH 05/23] Ausstellen --- src/lib/server/invoice.ts | 192 +++++++++++++++++++++++ src/lib/server/lexoffice.ts | 250 +++++++++++++++--------------- src/pages/api/admin/ausstellen.ts | 35 ++--- src/pages/api/user/index.ts | 12 ++ 4 files changed, 346 insertions(+), 143 deletions(-) create mode 100644 src/lib/server/invoice.ts diff --git a/src/lib/server/invoice.ts b/src/lib/server/invoice.ts new file mode 100644 index 00000000..dfe97efa --- /dev/null +++ b/src/lib/server/invoice.ts @@ -0,0 +1,192 @@ +import { getAusweisartFromId } from "#components/Ausweis/types.js"; +import moment from "moment"; +import { createLexOfficeCustomer } from "./lexoffice.js"; +import { Enums, prisma, Rechnung, VerbrauchsausweisWohnen } from "./prisma.js"; +import { LEX_OFFICE_API_KEY, PRICES } from "#lib/constants.js"; + +export function createLineItem(name: string, preis: number, steuer: number) { + return { + "type": "custom", + "name": name, + "description": "", + "quantity": 1, + "lineItemAmount": preis, + "unitName": name, + "unitPrice": { + "currency": "EUR", + "grossAmount": preis, + "taxRatePercentage": steuer + } + }; +} + +export function addedServicesNeu(data: any, rechnung: Rechnung, steuer: number){ + if (rechnung.services.includes(Enums.Service.Qualitaetsdruck)){ + data["lineItems"].push(createLineItem('Zusatzservice Postversand', 9, steuer)) + } + if (rechnung.services.includes(Enums.Service.Aushang)){ + data["lineItems"].push(createLineItem('Zusatzservice Aushang', 10, steuer)) + } + if (rechnung.services.includes(Enums.Service.SameDay)){ + data["lineItems"].push(createLineItem('Zusatzservice Same Day Service', 29, steuer)) + } + if (rechnung.services.includes(Enums.Service.Telefonberatung)){ + data["lineItems"].push(createLineItem('Zusatzservice Telefonische Beratung', 75, steuer)) + } + + return data; +} + +/** + * Erstellt eine Rechnung in LexOffice und gibt die ID zurück. + * Die Preise basieren auf den in der Konstante `__PRICES__` definierten Preisen. + * @param Ausweis ausweis + * @param Rechnung $rechnung + * @return array + * @throws Error + */ +export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung: Rechnung) { + if (!ausweis.benutzer_id) { + throw new Error("Benutzer ist nicht vorhanden") + } + + const user = await prisma.benutzer.findUnique({ + where: { + id: ausweis.benutzer_id + } + }) + + if (!user) { + throw new Error("Nutzer existiert nicht!"); + } else if (user.lex_office_id == null) { + // User has no valid lex_id + const lex_office_id = await createLexOfficeCustomer(user); + + user.lex_office_id = lex_office_id; + + await prisma.benutzer.update({ + where: { + id: user.id + }, + data: { + lex_office_id: user.lex_office_id + } + }) + } + + const ausweisart = getAusweisartFromId(ausweis.id); + + let data = { + "voucherDate": moment().format('YYYY-MM-DDTHH:mm:ss.SSSZ'), + "taxConditions": { + "taxType": "gross" + }, + "shippingConditions": { + "shippingType": "none" + }, + "address": { + "contactId": user.lex_office_id, + "name": rechnung.empfaenger, + "street": rechnung.strasse, + "city": rechnung.ort, + "zip": rechnung.plz, + "countryCode": "DE", + "supplement": rechnung.zusatzzeile + }, + "lineItems": [], + "totalPrice": { + "currency": "EUR", + "totalGrossAmount": rechnung.betrag, + }, + "title": "Rechnung", + "introduction": "Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung", + "remark": "Vielen Dank für Ihren Einkauf." + }; + + if (rechnung.status == Enums.Rechnungsstatus.paid) { + const types = { + [Enums.Bezahlmethoden.paypal]: "PayPal", + [Enums.Bezahlmethoden.creditcard]: "Kreditkarte", + [Enums.Bezahlmethoden.sofort]: "Sofortüberweisung", + [Enums.Bezahlmethoden.giropay]: "Giropay", + }; + + const type = types[rechnung.bezahlmethode]; + + data["introduction"] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`; + } + + const tax_rate = 19; + + if (rechnung.betrag == 15) { + // Korrektur alleinstehend + data["lineItems"].push(createLineItem("Service Korrektur anfordern", rechnung.betrag, 19)); + } else if (rechnung.betrag == 476) { + data["lineItems"].push(createLineItem("GEG Berechnung Wohngebäude", rechnung.betrag, 19)); + } else if (rechnung.betrag > 400 && rechnung.betrag != 476) { + data["lineItems"].push(createLineItem("Bedarfsausweis Gewerbe", rechnung.betrag, 19)); + } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { + if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { + data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19)); + } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { + data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19)); + } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { + data["lineItems"].push(createLineItem(`Verbrauchsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19)); + } + } else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) { + if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { + data["lineItems"].push(createLineItem(`Bedarfsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19)); + } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { + data["lineItems"].push(createLineItem(`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19)); + } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { + data["lineItems"].push(createLineItem(`Bedarfsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19)); + } + } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) { + if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { + data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Standard, 19)); + } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { + data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Beratung, 19)); + } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { + data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Offline, 19)); + } + } + + data = addedServicesNeu(data, rechnung, 19); + + + const response = await fetch("https://api.lexoffice.io/v1/invoices?finalize=true", { + method: "POST", + headers: { + Accept: `application/json`, + Authorization: `Bearer ${LEX_OFFICE_API_KEY}`, + "Content-Type": "application/json" + }, + body: JSON.stringify(data) + }) + + if (response.status == 400) { + throw new Error("Fehler beim Absenden der Request.") + } + + const invoice = await response.json() + + // Wir müssen den Ausweis nun wieder abfragen, um die erstellte Rechnungsnummer zu bekommen. + const response_id = invoice["id"]; + + const request = await fetch(`https://api.lexoffice.io/v1/invoices/${response_id}`, { + method: "POSGETT", + headers: { + Accept: `application/json`, + Authorization: `Bearer ${LEX_OFFICE_API_KEY}`, + "Content-Type": "application/json" + }, + body: JSON.stringify(data) + }) + + const abfrage_response = await request.json() + + return { + id: invoice["id"], + voucherNumber: abfrage_response["voucherNumber"] + } +} \ No newline at end of file diff --git a/src/lib/server/lexoffice.ts b/src/lib/server/lexoffice.ts index df52a8e9..e2bf82b7 100644 --- a/src/lib/server/lexoffice.ts +++ b/src/lib/server/lexoffice.ts @@ -1,10 +1,10 @@ import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { LEX_OFFICE_API_KEY } from "#lib/constants.js"; -import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma"; -import { prisma } from "#lib/server/prisma"; +import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js"; +import { prisma } from "#lib/server/prisma.js"; import moment from "moment"; -export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: { +export async function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: { bezeichnung: string, positionstext: string, preis: number, @@ -103,149 +103,149 @@ export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | Bedarf throw new Error(`Ein Fehler ist aufgetreten: ${pdfResult.message}`); } - $pdf_id = $render_response["documentFileId"]; + // $pdf_id = $render_response["documentFileId"]; - db()->execute("UPDATE Angebotsanfragen SET - Adresse_Objekt = :Adresse_Objekt, - PLZ_Objekt = :PLZ_Objekt, - Ort_Objekt = :Ort_Objekt, - Dienstleistung = :Dienstleistung, - Empfaengerrechnung = :Empfaengerrechnung, - Zusatzzeilerechnung = :Zusatzzeilerechnung, - Adresse = :Adresse, - PLZ = :PLZ, - Ort = :Ort, - Anlass = :Anlass, - Baujahrheizung = :Baujahrheizung, - Baujahrgebaeude = :Baujahrgebaeude, - Baujahrklima = :Baujahrklima, - Gebaeudetyp = :Gebaeudetyp, - Nutzflaeche = :Nutzflaeche, - Sanierungsstatus = :Sanierungsstatus, - Nachricht = :Nachricht, - Datei = :Datei, - Rolle = :Rolle, - Email = :Email, - Angebotspreis = :Angebotspreis, - Rabatt = :Rabatt, - `Status` = 'Verschickt', - lex_office_id = :lex_office_id, - Textanschreiben = :Textanschreiben, - Positionstext = :Positionstext - WHERE Auftragsnummer = :Auftragsnummer", [ - "Adresse_Objekt": $_POST["gebaeude_strasse"], - "PLZ_Objekt": $_POST["gebaeude_plz"], - "Ort_Objekt": $_POST["gebaeude_ort"], - "Dienstleistung": $_POST["dienstleistung"], - "Empfaengerrechnung": $_POST["rechnung_empfaenger"], - "Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"], - "Adresse": $_POST["rechnung_strasse"], - "PLZ": $_POST["rechnung_plz"], - "Ort": $_POST["rechnung_ort"], - "Anlass": $_POST["anlass"], - "Baujahrheizung": $_POST["baujahr_heizung"], - "Baujahrgebaeude": $_POST["baujahr_gebaeude"], - "Baujahrklima": $_POST["baujahr_klimaanlage"], - "Gebaeudetyp": $_POST["gebaeudetyp"], - "Nutzflaeche": $_POST["nutzflaeche"], - "Sanierungsstatus": $_POST["sanierungsstatus"], - "Nachricht": $_POST["nachricht"], - "Datei": $dateien, - "Rolle": $_POST["rolle"], - "Email": $_POST["email"], - "Angebotspreis": $_POST["Angebotspreis"], - "Rabatt": $_POST["Rabatt"], - "lex_office_id": $lex_office_id, - "Textanschreiben": $_POST["Textanschreiben"], - "Positionstext": $_POST["Positionstext"], - "Auftragsnummer": $_POST["Auftragsnummer"] - ]); + // db()->execute("UPDATE Angebotsanfragen SET + // Adresse_Objekt = :Adresse_Objekt, + // PLZ_Objekt = :PLZ_Objekt, + // Ort_Objekt = :Ort_Objekt, + // Dienstleistung = :Dienstleistung, + // Empfaengerrechnung = :Empfaengerrechnung, + // Zusatzzeilerechnung = :Zusatzzeilerechnung, + // Adresse = :Adresse, + // PLZ = :PLZ, + // Ort = :Ort, + // Anlass = :Anlass, + // Baujahrheizung = :Baujahrheizung, + // Baujahrgebaeude = :Baujahrgebaeude, + // Baujahrklima = :Baujahrklima, + // Gebaeudetyp = :Gebaeudetyp, + // Nutzflaeche = :Nutzflaeche, + // Sanierungsstatus = :Sanierungsstatus, + // Nachricht = :Nachricht, + // Datei = :Datei, + // Rolle = :Rolle, + // Email = :Email, + // Angebotspreis = :Angebotspreis, + // Rabatt = :Rabatt, + // `Status` = 'Verschickt', + // lex_office_id = :lex_office_id, + // Textanschreiben = :Textanschreiben, + // Positionstext = :Positionstext + // WHERE Auftragsnummer = :Auftragsnummer", [ + // "Adresse_Objekt": $_POST["gebaeude_strasse"], + // "PLZ_Objekt": $_POST["gebaeude_plz"], + // "Ort_Objekt": $_POST["gebaeude_ort"], + // "Dienstleistung": $_POST["dienstleistung"], + // "Empfaengerrechnung": $_POST["rechnung_empfaenger"], + // "Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"], + // "Adresse": $_POST["rechnung_strasse"], + // "PLZ": $_POST["rechnung_plz"], + // "Ort": $_POST["rechnung_ort"], + // "Anlass": $_POST["anlass"], + // "Baujahrheizung": $_POST["baujahr_heizung"], + // "Baujahrgebaeude": $_POST["baujahr_gebaeude"], + // "Baujahrklima": $_POST["baujahr_klimaanlage"], + // "Gebaeudetyp": $_POST["gebaeudetyp"], + // "Nutzflaeche": $_POST["nutzflaeche"], + // "Sanierungsstatus": $_POST["sanierungsstatus"], + // "Nachricht": $_POST["nachricht"], + // "Datei": $dateien, + // "Rolle": $_POST["rolle"], + // "Email": $_POST["email"], + // "Angebotspreis": $_POST["Angebotspreis"], + // "Rabatt": $_POST["Rabatt"], + // "lex_office_id": $lex_office_id, + // "Textanschreiben": $_POST["Textanschreiben"], + // "Positionstext": $_POST["Positionstext"], + // "Auftragsnummer": $_POST["Auftragsnummer"] + // ]); - // Die Auftragsnummer abfragen + // // Die Auftragsnummer abfragen - $curl_nummer = curl_init(); + // $curl_nummer = curl_init(); - curl_setopt_array($curl_nummer, [ - CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id", - CURLOPT_RETURNTRANSFER: true, - CURLOPT_ENCODING: "", - CURLOPT_MAXREDIRS: 10, - CURLOPT_TIMEOUT: 30, - CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST: "GET", - CURLOPT_HTTPHEADER: [ - "Accept: application/json", - "Authorization: Bearer " . LEX_OFFICE_API_KEY - ] - ]); + // curl_setopt_array($curl_nummer, [ + // CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id", + // CURLOPT_RETURNTRANSFER: true, + // CURLOPT_ENCODING: "", + // CURLOPT_MAXREDIRS: 10, + // CURLOPT_TIMEOUT: 30, + // CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, + // CURLOPT_CUSTOMREQUEST: "GET", + // CURLOPT_HTTPHEADER: [ + // "Accept: application/json", + // "Authorization: Bearer " . LEX_OFFICE_API_KEY + // ] + // ]); - $nummer_response = curl_exec($curl_nummer); - $nummer_response = json_decode($nummer_response, true); - $err = curl_error($curl_nummer); + // $nummer_response = curl_exec($curl_nummer); + // $nummer_response = json_decode($nummer_response, true); + // $err = curl_error($curl_nummer); - curl_close($curl_nummer); + // curl_close($curl_nummer); - // Und die Mail verschicken + // // Und die Mail verschicken - $mail = new PHPMailer\PHPMailer\PHPMailer(true); + // $mail = new PHPMailer\PHPMailer\PHPMailer(true); - $mail->IsSMTP(); - $mail->Host = "smtp.ionos.de"; - $mail->SMTPAuth = true; - $mail->Username = 'info@online-energieausweis.org'; - $mail->Password = 'Katendeich5a2024!'; + // $mail->IsSMTP(); + // $mail->Host = "smtp.ionos.de"; + // $mail->SMTPAuth = true; + // $mail->Username = 'info@online-energieausweis.org'; + // $mail->Password = 'Katendeich5a2024!'; - $mail->CharSet = 'UTF-8'; - $mail->Encoding = 'base64'; - $mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0); - $mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]); - $mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen"); - $mail->isHTML(true); - $mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}"; + // $mail->CharSet = 'UTF-8'; + // $mail->Encoding = 'base64'; + // $mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0); + // $mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]); + // $mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen"); + // $mail->isHTML(true); + // $mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}"; - // carriage return type (RFC) - $eol = "
"; - $anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"]; + // // carriage return type (RFC) + // $eol = "
"; + // $anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"]; - $message = "$anrede {$_POST["name"]},{$eol}{$eol}"; - $message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}"; - $message .= "Mit freundlichen Grüßen,$eol"; - $message .= "Jens Cornelsen$eol"; - $message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon 040 209339858{$eol}Fax 040 209339859"; - $mail->Body = $message; + // $message = "$anrede {$_POST["name"]},{$eol}{$eol}"; + // $message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}"; + // $message .= "Mit freundlichen Grüßen,$eol"; + // $message .= "Jens Cornelsen$eol"; + // $message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon 040 209339858{$eol}Fax 040 209339859"; + // $mail->Body = $message; - $curl_pdf = curl_init(); + // $curl_pdf = curl_init(); - curl_setopt_array($curl_pdf, [ - CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id", - CURLOPT_RETURNTRANSFER: true, - CURLOPT_ENCODING: "", - CURLOPT_MAXREDIRS: 10, - CURLOPT_TIMEOUT: 30, - CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST: "GET", - CURLOPT_HTTPHEADER: [ - "Accept: application/pdf", - "Authorization: Bearer " . LEX_OFFICE_API_KEY - ] - ]); + // curl_setopt_array($curl_pdf, [ + // CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id", + // CURLOPT_RETURNTRANSFER: true, + // CURLOPT_ENCODING: "", + // CURLOPT_MAXREDIRS: 10, + // CURLOPT_TIMEOUT: 30, + // CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, + // CURLOPT_CUSTOMREQUEST: "GET", + // CURLOPT_HTTPHEADER: [ + // "Accept: application/pdf", + // "Authorization: Bearer " . LEX_OFFICE_API_KEY + // ] + // ]); - $response = curl_exec($curl_pdf); - $err = curl_error($curl_pdf); + // $response = curl_exec($curl_pdf); + // $err = curl_error($curl_pdf); - $HOME = dirname($ROOT); + // $HOME = dirname($ROOT); - curl_close($curl_pdf); - $fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+"); - fwrite($fp, $response); - fclose($fp); + // curl_close($curl_pdf); + // $fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+"); + // fwrite($fp, $response); + // fclose($fp); - $mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf"); + // $mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf"); - $mail->send(); + // $mail->send(); - echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen."; + // echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen."; } export async function createLexOfficeCustomer(user: Benutzer) { diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index 9bbb345c..8ee95208 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -18,6 +18,8 @@ import { BASE_URI } from "#lib/constants.js"; import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js"; import { PutObjectCommand } from "@aws-sdk/client-s3"; import { s3Client } from "#lib/s3.js"; +import { createInvoice } from "#lib/server/invoice.js"; +import { tryCatch } from "#lib/tryCatch.js"; export const GET = defineApiRoute({ input: z.object({ @@ -125,27 +127,24 @@ export const GET = defineApiRoute({ }); } - // TODO - // SECTION: Rechnung erstellen (LexOffice) - // Wir wollen die Rechnung an lex office versenden, und uns die ID von da holen. - // Falls die Rechnung bereits existiert ist das nicht nötig. - // if (!$rechnung->lex_office_id) { - // [$lex_office_id, $renr] = createInvoice($ausweis, $rechnung); - // sleep(1); // TODO: Nach der Umstellung von LexOffice auf etwas anderes MUSS das hier unbedingt entfernt werden! + if (!rechnung.lex_office_id) { + const [result, error] = await tryCatch(createInvoice(ausweis, rechnung)); - // if (!$lex_office_id || !$renr) { - // die("Bei der Erstellung der Rechnung ist etwas schiefgelaufen - Möglicherweise ist etwas mit LexOffice?"); - // } + if (error) { + return + } - // $rechnung->lex_office_id = $lex_office_id; - // $rechnung->rechnungsnummer = $renr; - // $rechnung->save(); - // } + const { id, voucherNumber } = result; - // TODO - // if ($ausweis->erledigt != 2) {$ausweis->erstellungsdatum = date("Y-m-d H:i:s");} - // $ausweis->erledigt = 2; - // $ausweis->save(); + await prisma.rechnung.update({ + where: { + id: rechnung.id + }, + data: { + lex_office_id: id + } + }) + } const pdfAusweis = await getAnsichtsausweis( ausweis, diff --git a/src/pages/api/user/index.ts b/src/pages/api/user/index.ts index f035cc00..beb42b3c 100644 --- a/src/pages/api/user/index.ts +++ b/src/pages/api/user/index.ts @@ -3,6 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { generatePrefixedId } from "#lib/db.js"; import { adminMiddleware, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { hashPassword } from "#lib/password.js"; +import { createLexOfficeCustomer } from "#lib/server/lexoffice.js"; import { sendRegisterMail } from "#lib/server/mail/registrierung.js"; import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; @@ -117,6 +118,17 @@ export const PUT = defineApiRoute({ } }) + const lex_office_id = await createLexOfficeCustomer(user); + + await prisma.benutzer.update({ + where: { + id: user.id + }, + data: { + lex_office_id + } + }) + await sendRegisterMail(user) return { id } -- 2.49.1 From 71438a39ebe57a5d0bd3e5278d52058f34b0ff3a Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 21:31:47 -0400 Subject: [PATCH 06/23] Ausstellen --- src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 6 ++++-- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 6 ++++-- src/lib/server/ausweis.ts | 6 +++--- src/pages/api/admin/ausstellen.ts | 3 ++- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index f0f9862e..85ee9bae 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -11,7 +11,7 @@ import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; -export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient) { +export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) { const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64"); const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const pages = pdf.getPages() @@ -613,7 +613,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe for (const page of pages) { - addAnsichtsausweisLabel(page, font) + if (vorschau) { + addAnsichtsausweisLabel(page, font) + } addDatumGEG(page, font) } diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index e2b2ce5c..685236b9 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -12,7 +12,7 @@ import { getS3File } from "#lib/s3.js"; /* -------------------------------- Pdf Tools ------------------------------- */ -export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient) { +export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) { const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Wohngebaeude_ohne_pfeile.pdf", import.meta.url), "base64"); const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const pages = pdf.getPages() @@ -592,7 +592,9 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne } for (const page of pages) { - addAnsichtsausweisLabel(page, font) + if (vorschau) { + addAnsichtsausweisLabel(page, font) + } addDatumGEG(page, font) } diff --git a/src/lib/server/ausweis.ts b/src/lib/server/ausweis.ts index 3e37c7c7..d92a1896 100644 --- a/src/lib/server/ausweis.ts +++ b/src/lib/server/ausweis.ts @@ -31,15 +31,15 @@ export function getPrismaAusweisAdapter(id: string) { * Gibt den richtigen Ansichtsausweis basierend auf der Ausweisart zurück. * @param ausweis */ -export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromId(ausweis.id)) { +export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau: boolean = true, ausweisart = getAusweisartFromId(ausweis.id)) { if (!ausweisart) { return null } if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { - return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user) + return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user, vorschau) } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { - return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user) + return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, vorschau) } return null diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index 8ee95208..d5e8cc25 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -151,7 +151,8 @@ export const GET = defineApiRoute({ ausweis.aufnahme, ausweis.aufnahme.objekt, ausweis.aufnahme.bilder, - ausweis.aufnahme.objekt.benutzer + ausweis.aufnahme.objekt.benutzer, + false ); const pdfDatenblatt = await getDatenblatt( ausweis, -- 2.49.1 From 1970a105a977d412cdbb64765543f0b6af22090e Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 21:41:27 -0400 Subject: [PATCH 07/23] Webhook --- src/pages/api/webhooks/mollie.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/api/webhooks/mollie.ts b/src/pages/api/webhooks/mollie.ts index 1c3611bf..65f7990a 100644 --- a/src/pages/api/webhooks/mollie.ts +++ b/src/pages/api/webhooks/mollie.ts @@ -19,7 +19,7 @@ export const POST = defineApiRoute({ // Wir holen uns die Transaktion von Mollie. const payment = await mollieClient.payments.get(id); - const metadata = payment.metadata as { rechnung_uid: string } + const metadata = payment.metadata as { rechnung_id: string } if (!payment) { throw new APIError({ @@ -28,7 +28,7 @@ export const POST = defineApiRoute({ }); } - if (!metadata.rechnung_uid) { + if (!metadata.rechnung_id) { throw new APIError({ code: "BAD_REQUEST", message: "Rechnung UID nicht gefunden.", @@ -38,7 +38,7 @@ export const POST = defineApiRoute({ // Wir holen uns die Rechnung aus unserer Datenbank. const rechnung = await prisma.rechnung.findUnique({ where: { - uid: metadata.rechnung_uid, + id: metadata.rechnung_id, }, }); -- 2.49.1 From 176f1c08ad8f5755c451e7ec3d8db8db3158a50d Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 7 Apr 2025 23:55:42 -0400 Subject: [PATCH 08/23] Klimafaktoren --- .../VerbrauchsausweisGewerbe_2016.ts | 5 +- .../VerbrauchsausweisWohnen_2016.ts | 3 +- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 2 + src/lib/server/klimafaktoren.ts | 47 +++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/lib/server/klimafaktoren.ts diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts index 83d00205..83d8373f 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts @@ -2,7 +2,8 @@ import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#c import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js"; import moment from "moment"; -import bauwerkskatalog from "./bauwerkskatalog.json" assert { type: "json" } +import bauwerkskatalog from "./bauwerkskatalog.json" with { type: "json" } +import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient) { let tekWerte = new Array(8).fill(0); @@ -85,7 +86,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: }]; try { - const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz) + const response = await getKlimafaktorenServer(objekt.plz as string, moment(ausweis.startdatum).toDate(), moment(ausweis.startdatum).add(2, "years").toDate()) if (response) { klimafaktoren = response diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts index 78f543db..80c4904a 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts @@ -3,6 +3,7 @@ import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js"; import { Enums } from "#lib/client/prisma.js"; import moment from "moment"; +import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016( ausweis: VerbrauchsausweisWohnenClient, @@ -49,7 +50,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016( }]; try { - const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz) + const response = await getKlimafaktorenServer(objekt.plz as string, moment(ausweis.startdatum).toDate(), moment(ausweis.startdatum).add(2, "years").toDate()) if (response) { klimafaktoren = response diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index 685236b9..ecce3379 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -20,6 +20,8 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne // const template = VerbrauchsausweisWohnen2016Template as Template; const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + console.log(berechnungen?.klimafaktoren); + const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) const height = pages[0].getHeight() diff --git a/src/lib/server/klimafaktoren.ts b/src/lib/server/klimafaktoren.ts new file mode 100644 index 00000000..6c33dc97 --- /dev/null +++ b/src/lib/server/klimafaktoren.ts @@ -0,0 +1,47 @@ +import moment from "moment"; +import { prisma } from "./prisma.js"; + +export async function getKlimafaktorenServer(plz: string, startdatum: Date, enddatum: Date) { + const start = moment(startdatum); + const end = moment(enddatum); + + if (start.isSameOrAfter(end)) { + return [] + } + + const intervals = []; + + let currentDate = start.clone(); + while (currentDate.isSameOrBefore(end)) { + let copy = currentDate.clone(); + intervals.push(copy); + currentDate.add(1, "year"); + } + + let klimafaktoren = await prisma.klimafaktoren.findMany({ + where: { + plz, + month: intervals[0].month(), + OR: intervals.map((date) => { + return { + year: date.year(), + }; + }), + }, + }); + + if (!klimafaktoren) { + return [] + } + + // NOTE: Sollten wir hier lieber den Output padden und trotzdem die gefundenen zurückgeben? + if (klimafaktoren.length !== intervals.length) { + return [] + } + + return klimafaktoren.map((klimafaktor) => ({ + month: klimafaktor.month, + year: klimafaktor.year, + klimafaktor: klimafaktor.klimafaktor, + })); +} -- 2.49.1 From d8acd0476a17b3eed0a4d5b9f14ac326a1c77034 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Tue, 8 Apr 2025 13:06:42 -0400 Subject: [PATCH 09/23] Actions --- .github/workflows/dev-pipeline.yml | 6 +++--- .github/workflows/prod-pipeline.yml | 33 +++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/prod-pipeline.yml diff --git a/.github/workflows/dev-pipeline.yml b/.github/workflows/dev-pipeline.yml index 4446c5a3..a7d0b8ea 100644 --- a/.github/workflows/dev-pipeline.yml +++ b/.github/workflows/dev-pipeline.yml @@ -1,10 +1,10 @@ -name: Dev Pipeline +name: Development Pipeline on: pull_request: - branches: [main] + branches: [dev] push: - branches: [main] + branches: [dev] jobs: deploy: diff --git a/.github/workflows/prod-pipeline.yml b/.github/workflows/prod-pipeline.yml new file mode 100644 index 00000000..cf4e171d --- /dev/null +++ b/.github/workflows/prod-pipeline.yml @@ -0,0 +1,33 @@ +name: Production Pipeline + +on: + pull_request: + branches: [main] + push: + branches: [main] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install Bun + run: | + curl -fsSL https://bun.sh/install | bash + + - uses: appleboy/ssh-action@master + with: + host: ${{ secrets.PROD_HOST }} + username: ${{ secrets.PROD_USERNAME }} + password: ${{ secrets.PROD_PASSWORD }} + port: 22 + script: | + export PATH=$HOME/.bun/bin:$PATH + export PATH=$HOME/.nvm/versions/node/v22.14.0/bin:$PATH + echo $PATH + cd ~/online-energieausweis + git reset --hard origin/main + git clean -f -d + git pull origin main + git status + make prod \ No newline at end of file -- 2.49.1 From 13322836aa9c6d77cacde70e96b49c1f2cfcb11c Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Tue, 8 Apr 2025 13:53:32 -0400 Subject: [PATCH 10/23] Recover DB --- recover-db-dev.bash | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 recover-db-dev.bash diff --git a/recover-db-dev.bash b/recover-db-dev.bash new file mode 100644 index 00000000..e7b58155 --- /dev/null +++ b/recover-db-dev.bash @@ -0,0 +1,41 @@ +#!/bin/bash + +# === Configuration === +BUCKET_NAME="ibc-db-backup" +ENDPOINT_URL="https://s3-eu-central-1.ionoscloud.com" +LOCAL_DOWNLOAD_DIR="./" # Where to save the file + +# === Get latest file from IONOS S3 bucket === +LATEST_FILE=$(aws s3api list-objects-v2 \ + --bucket "$BUCKET_NAME" \ + --prefix "data-dump" \ + --endpoint-url "$ENDPOINT_URL" \ + --query 'Contents | sort_by(@, &LastModified) | [-1].Key' \ + --output text) + +# === Check if file was found === +if [ "$LATEST_FILE" == "None" ] || [ -z "$LATEST_FILE" ]; then + echo "❌ No matching .sql.br file found." + exit 1 +fi + +FILENAME=$(basename "$LATEST_FILE") +SQL_FILE="${FILENAME%.br}" # Remove .br suffix + +echo "📥 Downloading $LATEST_FILE" +aws s3 cp "s3://$BUCKET_NAME/$LATEST_FILE" "$LOCAL_DOWNLOAD_DIR" \ + --endpoint-url "$ENDPOINT_URL" + +# === Decompress with Brotli === +echo "🗜️ Decompressing $FILENAME -> $SQL_FILE" +brotli -d "$FILENAME" + +# === Import into Postgres inside Docker === +echo "🐘 Importing into PostgreSQL (online-energieausweis-database-1:main)" +docker exec -i "online-energieausweis-database-1" env PGPASSWORD="hHMP8cd^N3SnzGRR" \ + psql -U "main" -d "main" < "$SQL_FILE" + +echo "✅ Import complete." + +# === Optional: Clean up +rm "$FILENAME" "$SQL_FILE" \ No newline at end of file -- 2.49.1 From 07760aa26aa52ac146babf5f01b928f8a54e4d18 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Tue, 8 Apr 2025 15:13:17 -0400 Subject: [PATCH 11/23] Bugfix Process not defined --- .github/workflows/dev-pipeline.yml | 4 +- backup-database.bash | 13 +++++-- .../VerbrauchsausweisGewerbe_2016.ts | 32 +--------------- .../VerbrauchsausweisGewerbe_2016_Client.ts | 18 +++++++++ .../VerbrauchsausweisGewerbe_2016_Server.ts | 18 +++++++++ .../VerbrauchsausweisWohnen_2016.ts | 37 +------------------ .../VerbrauchsausweisWohnen_2016_Client.ts | 22 +++++++++++ .../VerbrauchsausweisWohnen_2016_Server.ts | 22 +++++++++++ src/lib/Berechnungen/endEnergieVerbrauch.ts | 13 ------- src/lib/Klimafaktoren.ts | 2 - .../pdfDatenblattVerbrauchsausweisGewerbe.ts | 4 +- .../pdfDatenblattVerbrauchsausweisWohnen.ts | 3 +- src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 4 +- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 3 +- 14 files changed, 103 insertions(+), 92 deletions(-) create mode 100644 src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts create mode 100644 src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts create mode 100644 src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts create mode 100644 src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts delete mode 100644 src/lib/Berechnungen/endEnergieVerbrauch.ts diff --git a/.github/workflows/dev-pipeline.yml b/.github/workflows/dev-pipeline.yml index a7d0b8ea..c0de330f 100644 --- a/.github/workflows/dev-pipeline.yml +++ b/.github/workflows/dev-pipeline.yml @@ -26,8 +26,8 @@ jobs: export PATH=$HOME/.nvm/versions/node/v22.14.0/bin:$PATH echo $PATH cd ~/online-energieausweis - git reset --hard origin/main + git reset --hard origin/dev git clean -f -d - git pull origin main + git pull origin dev git status make prod \ No newline at end of file diff --git a/backup-database.bash b/backup-database.bash index 420566aa..dca6ef52 100644 --- a/backup-database.bash +++ b/backup-database.bash @@ -2,20 +2,27 @@ FILE_NAME=data-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br FILE_NAME_COMPLETE=full-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br -# Wir exportieren die Datenbank und komprimieren sie. -docker exec -t online-energieausweis-database-1 pg_dump --data-only -U main main | brotli --best > $FILE_NAME -docker exec -t online-energieausweis-database-1 pg_dumpall -c -U main | brotli --best > $FILE_NAME_COMPLETE # Das wird benötigt für AWS Ionos Kompatibilität. export AWS_REQUEST_CHECKSUM_CALCULATION=when_required export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required +# Wir exportieren die Datenbank und komprimieren sie. # IMPORTANT: Dieser Befehl benötigt das `ionos` Profil, sonst wird er nicht funktionieren. # Das Profil kann mit `aws configure --profile ionos` erstellt werden. # Den Key dafür findet man auf https://dcd.ionos.com/latest/?lang=en#/key-management +docker exec -t online-energieausweis-database-1 pg_dump --data-only -U main main | brotli --best > $FILE_NAME + aws s3 cp $FILE_NAME s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD + +echo "Uploaded $FILE_NAME" + +docker exec -t online-energieausweis-database-1 pg_dumpall -c -U main | brotli --best > $FILE_NAME_COMPLETE + aws s3 cp $FILE_NAME_COMPLETE s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD +echo "Uploaded $FILE_NAME_COMPLETE" + # Wir entfernen das Backup rm $FILE_NAME rm $FILE_NAME_COMPLETE \ No newline at end of file diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts index 83d8373f..4df06efd 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts @@ -60,42 +60,12 @@ function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient * @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll * @return VerbrauchsausweisGewerbeCalculationResult */ -export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) { +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, klimafaktoren: { month: number, year: number, klimafaktor: number }[]) { if (!aufnahme || !objekt || !ausweis) { return null; } const nutzflaeche = aufnahme.nutzflaeche || 0; - - let startdatum = moment(ausweis.startdatum); - - let klimafaktoren: Awaited> = [{ - month: startdatum.month(), - year: startdatum.year(), - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 1, - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 2, - klimafaktor: 1 - }]; - - try { - const response = await getKlimafaktorenServer(objekt.plz as string, moment(ausweis.startdatum).toDate(), moment(ausweis.startdatum).add(2, "years").toDate()) - - if (response) { - klimafaktoren = response - } - } catch (e) { - // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück. - // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung. - // return null - } // Endenergieverbrauch // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts new file mode 100644 index 00000000..a4bbf60c --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts @@ -0,0 +1,18 @@ +import moment from "moment"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "./VerbrauchsausweisGewerbe_2016.js"; +import { Aufnahme, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma.js"; +import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; + +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server( + ausweis: VerbrauchsausweisGewerbe, + aufnahme: Aufnahme, + objekt: Objekt, +) { + const klimafaktoren = await getKlimafaktoren( + objekt.plz as string, + moment(ausweis.startdatum).toDate(), + moment(ausweis.startdatum).add(2, "years").toDate() + ) || []; + + return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren) +} diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts new file mode 100644 index 00000000..444c5885 --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts @@ -0,0 +1,18 @@ +import moment from "moment"; +import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "./VerbrauchsausweisGewerbe_2016.js"; +import { Aufnahme, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma.js"; + +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server( + ausweis: VerbrauchsausweisGewerbe, + aufnahme: Aufnahme, + objekt: Objekt, +) { + const klimafaktoren = await getKlimafaktorenServer( + objekt.plz as string, + moment(ausweis.startdatum).toDate(), + moment(ausweis.startdatum).add(2, "years").toDate() + ) || []; + + return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren) +} diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts index 80c4904a..cea67662 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts @@ -1,9 +1,6 @@ import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; -import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js"; import { Enums } from "#lib/client/prisma.js"; -import moment from "moment"; -import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016( ausweis: VerbrauchsausweisWohnenClient, @@ -25,43 +22,13 @@ export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016( export async function endEnergieVerbrauchVerbrauchsausweis_2016( ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, - objekt: ObjektClient + objekt: ObjektClient, + klimafaktoren: {month: number, year: number, klimafaktor: number}[] ) { if (!aufnahme || !objekt || !ausweis) { return null; } - let startdatum = moment(ausweis.startdatum); - - let klimafaktoren: Awaited> = [{ - month: startdatum.month(), - year: startdatum.year(), - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 1, - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 2, - klimafaktor: 1 - }]; - - try { - const response = await getKlimafaktorenServer(objekt.plz as string, moment(ausweis.startdatum).toDate(), moment(ausweis.startdatum).add(2, "years").toDate()) - - if (response) { - klimafaktoren = response - } - } catch (e) { - // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück. - // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung. - // return null - } - - // Endenergieverbrauch // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. let brennstoff_1 = getHeizwertfaktor( diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts new file mode 100644 index 00000000..0d3882e7 --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts @@ -0,0 +1,22 @@ +import { + VerbrauchsausweisWohnenClient, + AufnahmeClient, + ObjektClient, +} from "#components/Ausweis/types.js"; +import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; +import moment from "moment"; +import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen_2016.js"; + +export async function endEnergieVerbrauchVerbrauchsausweis_2016_Client( + ausweis: VerbrauchsausweisWohnenClient, + aufnahme: AufnahmeClient, + objekt: ObjektClient, +) { + const klimafaktoren = await getKlimafaktoren( + objekt.plz as string, + moment(ausweis.startdatum).toDate(), + moment(ausweis.startdatum).add(2, "years").toDate() + ) || []; + + return await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt, klimafaktoren) +} diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts new file mode 100644 index 00000000..1ebaf566 --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts @@ -0,0 +1,22 @@ +import { + VerbrauchsausweisWohnenClient, + AufnahmeClient, + ObjektClient, +} from "#components/Ausweis/types.js"; +import moment from "moment"; +import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen_2016.js"; +import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; + +export async function endEnergieVerbrauchVerbrauchsausweis_2016_Server( + ausweis: VerbrauchsausweisWohnenClient, + aufnahme: AufnahmeClient, + objekt: ObjektClient, +) { + const klimafaktoren = await getKlimafaktorenServer( + objekt.plz as string, + moment(ausweis.startdatum).toDate(), + moment(ausweis.startdatum).add(2, "years").toDate() + ) || []; + + return await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt, klimafaktoren) +} diff --git a/src/lib/Berechnungen/endEnergieVerbrauch.ts b/src/lib/Berechnungen/endEnergieVerbrauch.ts deleted file mode 100644 index 4edb4de2..00000000 --- a/src/lib/Berechnungen/endEnergieVerbrauch.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { VerbrauchsausweisWohnen } from "#lib/client/prisma"; -import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; -import { AufnahmeClient, ObjektClient } from "#components/Ausweis/types.js"; - -export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen, aufnahme: AufnahmeClient, objekt: ObjektClient): Promise { - const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); - - if (!result) { - return 0; - } - - return result.endEnergieVerbrauchGesamt; -} \ No newline at end of file diff --git a/src/lib/Klimafaktoren.ts b/src/lib/Klimafaktoren.ts index 5326b948..9dbed741 100644 --- a/src/lib/Klimafaktoren.ts +++ b/src/lib/Klimafaktoren.ts @@ -18,8 +18,6 @@ export const getKlimafaktoren = memoize(async (date: Date, plz: string) => { }); return response; } catch (e) { - console.log(e); - return null; } }); diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts index 6a9d4c56..e8fb7a80 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts @@ -4,8 +4,8 @@ import { PDFDocument, StandardFonts } from "pdf-lib"; import { xml2pdf } from "./elements/xml2pdf.js"; import moment from "moment"; import { Enums, Heizungsstatus } from "#lib/server/prisma.js"; -import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; import { copyPage } from "./utils/copyPage.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -18,7 +18,7 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(ausweis, aufnahme, objekt); const height = pages[0].getHeight() const width = pages[0].getWidth() diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts index 54f69d4b..ea3d49ff 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts @@ -6,6 +6,7 @@ import { xml2pdf } from "./elements/xml2pdf.js"; import moment from "moment"; import { Enums, Heizungsstatus } from "#lib/server/prisma.js"; import { copyPage } from "./utils/copyPage.js"; +import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -19,7 +20,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016_Server(ausweis, aufnahme, objekt); const height = pages[0].getHeight() const width = pages[0].getWidth() diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index 85ee9bae..2b219e3c 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -1,5 +1,4 @@ import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; -import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js"; import { Enums } from "#lib/server/prisma.js"; import * as fs from "fs" @@ -9,6 +8,7 @@ import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js"; export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) { @@ -18,7 +18,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(ausweis, aufnahme, objekt); const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index ecce3379..83c34e51 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -9,6 +9,7 @@ import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; +import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -19,7 +20,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016_Server(ausweis, aufnahme, objekt); console.log(berechnungen?.klimafaktoren); const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) -- 2.49.1 From d354189d3c61b930a53645ebfe2518390153b6d8 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Tue, 8 Apr 2025 18:49:29 -0400 Subject: [PATCH 12/23] Ausweis, Ausstellung, Adresse --- .../Dashboard/DashboardAusweis.svelte | 37 +++++--- src/components/Notifications/shared.ts | 6 ++ .../VerbrauchsausweisGewerbe_2016.ts | 2 +- .../VerbrauchsausweisGewerbe_2016_Client.ts | 31 +++++-- .../VerbrauchsausweisGewerbe_2016_Server.ts | 29 ++++++- .../VerbrauchsausweisWohnen_2016.ts | 2 +- .../VerbrauchsausweisWohnen_2016_Client.ts | 29 ++++++- .../VerbrauchsausweisWohnen_2016_Server.ts | 38 +++++++-- src/lib/constants.ts | 2 +- .../pdfDatenblattVerbrauchsausweisGewerbe.ts | 2 +- .../pdfDatenblattVerbrauchsausweisWohnen.ts | 3 - src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 2 +- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 2 - src/lib/server/db.ts | 60 +++++++++++++ src/lib/server/invoice.ts | 7 +- .../Dashboard/DashboardAufnahmeModule.svelte | 4 +- src/pages/api/admin/ausstellen.ts | 84 ++++++++----------- src/pages/api/admin/registriernummer.ts | 15 ++-- src/pages/api/rechnung/index.ts | 39 +++++++++ 19 files changed, 289 insertions(+), 105 deletions(-) diff --git a/src/components/Dashboard/DashboardAusweis.svelte b/src/components/Dashboard/DashboardAusweis.svelte index 2e1e09fe..8fa08c8a 100644 --- a/src/components/Dashboard/DashboardAusweis.svelte +++ b/src/components/Dashboard/DashboardAusweis.svelte @@ -15,7 +15,9 @@ import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { Enums, Objekt } from "#lib/client/prisma.js"; import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; - import { addNotification } from "#components/Notifications/shared.js"; + import { addNotification, updateNotification } from "#components/Notifications/shared.js"; + import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js"; + import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js"; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let aufnahme: AufnahmeKomplettClient; @@ -86,15 +88,15 @@ let calculations = null; if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { - calculations = endEnergieVerbrauchVerbrauchsausweis_2016(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt); + calculations = endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt); } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { - calculations = endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt); + calculations = endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt); } - async function registriernummerAnfordern() { + async function registriernummer() { try { const result = await api.admin.registriernummer.GET.fetch({ - uid: ausweis.id + id: ausweis.id }, { headers: { "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` @@ -141,7 +143,13 @@ } } - async function ausweisAusstellen() { + async function ausstellen() { + const notification = addNotification({ + message: "Ausweis wird ausgestellt.", + subtext: "Der Ausweis wird nun ausgestellt, bitte habe einen Augenblick geduld..", + type: "info", + timeout: 0, + }) try { await api.admin.ausstellen.GET.fetch({ id_ausweis: ausweis.id @@ -150,8 +158,17 @@ "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` } }) + + ausweis.ausgestellt = true; + + updateNotification(notification, { + message: "Ausweis ausgestellt.", + subtext: "Der Ausweis wurde erfolgreich ausgestellt.", + timeout: 3000, + type: "success", + }) } catch(e) { - addNotification({ + updateNotification(notification, { message: "Das hat nicht geklappt.", subtext: e as string, timeout: 3000, @@ -248,7 +265,7 @@

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

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

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

- {:else} + {:else if !ausweis.ausgestellt}

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

{/if} {/if} @@ -396,9 +413,9 @@ {/if} {#if benutzer.rolle === Enums.BenutzerRolle.ADMIN} - + - + {/if} ) value[uid] = { ...defaults, ...value[uid], ...updater } as Notification; return value; }) + + if (updater.timeout) { + setTimeout(() => { + deleteNotification(uid); + }, updater.timeout); + } } export function addNotification(notification: Partial): string { diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts index 4df06efd..dde2ebb5 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts @@ -61,7 +61,7 @@ function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient * @return VerbrauchsausweisGewerbeCalculationResult */ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, klimafaktoren: { month: number, year: number, klimafaktor: number }[]) { - if (!aufnahme || !objekt || !ausweis) { + if (!aufnahme || !objekt || !ausweis || !klimafaktoren) { return null; } diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts index a4bbf60c..0c8842b5 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts @@ -3,16 +3,37 @@ import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "./Verbrauchsau import { Aufnahme, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma.js"; import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; -export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server( +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client( ausweis: VerbrauchsausweisGewerbe, aufnahme: Aufnahme, objekt: Objekt, ) { - const klimafaktoren = await getKlimafaktoren( + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktoren( objekt.plz as string, - moment(ausweis.startdatum).toDate(), - moment(ausweis.startdatum).add(2, "years").toDate() - ) || []; + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); + + if (!klimafaktoren || klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren) } diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts index 444c5885..41032d89 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts @@ -8,11 +8,32 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server( aufnahme: Aufnahme, objekt: Objekt, ) { - const klimafaktoren = await getKlimafaktorenServer( + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktorenServer( objekt.plz as string, - moment(ausweis.startdatum).toDate(), - moment(ausweis.startdatum).add(2, "years").toDate() - ) || []; + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); + + if (klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren) } diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts index cea67662..60ed6296 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts @@ -25,7 +25,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016( objekt: ObjektClient, klimafaktoren: {month: number, year: number, klimafaktor: number}[] ) { - if (!aufnahme || !objekt || !ausweis) { + if (!aufnahme || !objekt || !ausweis || !klimafaktoren) { return null; } diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts index 0d3882e7..7bee248d 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts @@ -12,11 +12,32 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016_Client( aufnahme: AufnahmeClient, objekt: ObjektClient, ) { - const klimafaktoren = await getKlimafaktoren( + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktoren( objekt.plz as string, - moment(ausweis.startdatum).toDate(), - moment(ausweis.startdatum).add(2, "years").toDate() - ) || []; + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); + + if (!klimafaktoren || klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } return await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt, klimafaktoren) } diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts index 1ebaf566..283249d1 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts @@ -10,13 +10,39 @@ import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; export async function endEnergieVerbrauchVerbrauchsausweis_2016_Server( ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, - objekt: ObjektClient, + objekt: ObjektClient ) { - const klimafaktoren = await getKlimafaktorenServer( + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktorenServer( objekt.plz as string, - moment(ausweis.startdatum).toDate(), - moment(ausweis.startdatum).add(2, "years").toDate() - ) || []; + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); - return await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt, klimafaktoren) + if (klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } + + return await endEnergieVerbrauchVerbrauchsausweis_2016( + ausweis, + aufnahme, + objekt, + klimafaktoren + ); } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 48b23008..271410da 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -112,4 +112,4 @@ export const SERVICES: Record< }; export const BASE_URI = process.env.NODE_ENV == "production" ? "https://online-energieausweis.org" : "http://localhost:3000"; -export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "znjmkmbA3Hbx9dC7wdKp7TnOf1pcRl_tCUwEBZys7bj-QRPG" \ No newline at end of file +export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" \ No newline at end of file diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts index e8fb7a80..05811876 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts @@ -5,7 +5,7 @@ import { xml2pdf } from "./elements/xml2pdf.js"; import moment from "moment"; import { Enums, Heizungsstatus } from "#lib/server/prisma.js"; import { copyPage } from "./utils/copyPage.js"; -import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js"; /* -------------------------------- Pdf Tools ------------------------------- */ diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts index ea3d49ff..4c7d1ab1 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts @@ -333,8 +333,5 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau await layoutPage2.draw(pages[1], 0, pages[1].getHeight()) await layoutPage3.draw(pages[2], 0, pages[2].getHeight()) - console.log("DONE"); - - return pdf.save(); } \ No newline at end of file diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index 2b219e3c..ab3d3b4a 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -8,7 +8,7 @@ import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; -import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js"; export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) { diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index 83c34e51..51701dff 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -1,5 +1,4 @@ import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; -import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js"; import { Enums } from "#lib/server/prisma.js"; import * as fs from "fs" @@ -21,7 +20,6 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne // const template = VerbrauchsausweisWohnen2016Template as Template; const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016_Server(ausweis, aufnahme, objekt); - console.log(berechnungen?.klimafaktoren); const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) diff --git a/src/lib/server/db.ts b/src/lib/server/db.ts index bf628b9d..39235642 100644 --- a/src/lib/server/db.ts +++ b/src/lib/server/db.ts @@ -8,6 +8,26 @@ export async function getVerbrauchsausweisWohnen(id: string): Promise { return await prisma.verbrauchsausweisGewerbe.findUnique({ where: { @@ -16,6 +36,26 @@ export async function getVerbrauchsausweisGewerbe(id: string): Promise { return await prisma.bedarfsausweisWohnen.findUnique({ where: { @@ -24,6 +64,26 @@ export async function getBedarfsausweisWohnen(id: string): Promise { return await prisma.bedarfsausweisGewerbe.findUnique({ where: { diff --git a/src/lib/server/invoice.ts b/src/lib/server/invoice.ts index dfe97efa..43f4160f 100644 --- a/src/lib/server/invoice.ts +++ b/src/lib/server/invoice.ts @@ -86,7 +86,7 @@ export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung: }, "address": { "contactId": user.lex_office_id, - "name": rechnung.empfaenger, + "name": rechnung.empfaenger || "----", "street": rechnung.strasse, "city": rechnung.ort, "zip": rechnung.plz, @@ -174,13 +174,12 @@ export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung: const response_id = invoice["id"]; const request = await fetch(`https://api.lexoffice.io/v1/invoices/${response_id}`, { - method: "POSGETT", + method: "GET", headers: { Accept: `application/json`, Authorization: `Bearer ${LEX_OFFICE_API_KEY}`, "Content-Type": "application/json" - }, - body: JSON.stringify(data) + } }) const abfrage_response = await request.json() diff --git a/src/modules/Dashboard/DashboardAufnahmeModule.svelte b/src/modules/Dashboard/DashboardAufnahmeModule.svelte index fcc60428..2b6e7d17 100644 --- a/src/modules/Dashboard/DashboardAufnahmeModule.svelte +++ b/src/modules/Dashboard/DashboardAufnahmeModule.svelte @@ -4,7 +4,7 @@ import Carousel from "#components/Carousel.svelte"; import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte"; import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte"; - import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte"; + import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte"; import { Objekt } from "#lib/client/prisma.js"; import mime from "mime" import { ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons"; @@ -96,5 +96,5 @@
- +
\ No newline at end of file diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index d5e8cc25..9fec4e32 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -20,6 +20,7 @@ import { PutObjectCommand } from "@aws-sdk/client-s3"; import { s3Client } from "#lib/s3.js"; import { createInvoice } from "#lib/server/invoice.js"; import { tryCatch } from "#lib/tryCatch.js"; +import { getBedarfsausweisWohnenKomplett, getVerbrauchsausweisGewerbeKomplett, getVerbrauchsausweisWohnenKomplett } from "#lib/server/db.js"; export const GET = defineApiRoute({ input: z.object({ @@ -46,59 +47,11 @@ export const GET = defineApiRoute({ | null = null; if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { - ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ - where: { - id: id_ausweis, - }, - include: { - aufnahme: { - include: { - bilder: true, - objekt: { - include: { - benutzer: true, - }, - }, - }, - }, - }, - }); + ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis) } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { - ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({ - where: { - id: id_ausweis, - }, - include: { - aufnahme: { - include: { - bilder: true, - objekt: { - include: { - benutzer: true, - }, - }, - }, - }, - }, - }); + ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis) } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { - ausweis = await prisma.bedarfsausweisWohnen.findUnique({ - where: { - id: id_ausweis, - }, - include: { - aufnahme: { - include: { - bilder: true, - objekt: { - include: { - benutzer: true, - }, - }, - }, - }, - }, - }); + ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis) } if (!ausweis) { @@ -273,5 +226,34 @@ fax 040 · 209339859 subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`, text, }); + + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + await prisma.verbrauchsausweisWohnen.update({ + where: { + id: ausweis.id + }, + data: { + ausgestellt: true + } + }) + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + await prisma.verbrauchsausweisGewerbe.update({ + where: { + id: ausweis.id + }, + data: { + ausgestellt: true + } + }) + } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { + await prisma.bedarfsausweisWohnen.update({ + where: { + id: ausweis.id + }, + data: { + ausgestellt: true, + } + }) + } }, }); diff --git a/src/pages/api/admin/registriernummer.ts b/src/pages/api/admin/registriernummer.ts index 02c89216..c8a0d090 100644 --- a/src/pages/api/admin/registriernummer.ts +++ b/src/pages/api/admin/registriernummer.ts @@ -7,10 +7,7 @@ import { authorizationHeaders, } from "#lib/middleware/authorization.js"; import { - BedarfsausweisWohnen, Enums, - VerbrauchsausweisGewerbe, - VerbrauchsausweisWohnen, } from "#lib/server/prisma.js"; import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; @@ -21,14 +18,14 @@ import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js"; export const GET = defineApiRoute({ input: z.object({ - uid: UUidWithPrefix, + id: UUidWithPrefix, }), headers: authorizationHeaders, middleware: adminMiddleware, - async fetch({ uid }, context, user) { - const ausweisart = getAusweisartFromId(uid); + async fetch({ id }, context, user) { + const ausweisart = getAusweisartFromId(id); const adapter = getPrismaAusweisAdapter( - uid + id ) as typeof prisma.verbrauchsausweisWohnen; if (!adapter) { @@ -40,7 +37,7 @@ export const GET = defineApiRoute({ const ausweis = await adapter.findUnique({ where: { - uid, + id, }, include: { aufnahme: { @@ -193,7 +190,7 @@ export const GET = defineApiRoute({ adapter as typeof prisma.verbrauchsausweisWohnen ).update({ where: { - uid, + id, }, data: { registriernummer: diff --git a/src/pages/api/rechnung/index.ts b/src/pages/api/rechnung/index.ts index 4389efac..99cd51a8 100644 --- a/src/pages/api/rechnung/index.ts +++ b/src/pages/api/rechnung/index.ts @@ -101,6 +101,19 @@ export const PUT = defineApiRoute({ betrag, bezahlmethode: bezahlmethode, status: Enums.Rechnungsstatus.open, + abweichende_versand_adresse: input.abweichende_versand_adresse, + email: input.email, + empfaenger: input.empfaenger, + ort: input.ort, + plz: input.plz, + strasse: input.strasse, + telefon: input.telefon, + versand_ort: input.versand_ort, + versand_empfaenger: input.versand_empfaenger, + versand_plz: input.versand_plz, + versand_strasse: input.versand_strasse, + versand_zusatzzeile: input.versand_zusatzzeile, + zusatzzeile: input.zusatzzeile, verbrauchsausweis_wohnen: { connect: { id: ausweis_id @@ -118,6 +131,19 @@ export const PUT = defineApiRoute({ betrag, bezahlmethode: bezahlmethode, status: Enums.Rechnungsstatus.open, + abweichende_versand_adresse: input.abweichende_versand_adresse, + email: input.email, + empfaenger: input.empfaenger, + ort: input.ort, + plz: input.plz, + strasse: input.strasse, + telefon: input.telefon, + versand_ort: input.versand_ort, + versand_empfaenger: input.versand_empfaenger, + versand_plz: input.versand_plz, + versand_strasse: input.versand_strasse, + versand_zusatzzeile: input.versand_zusatzzeile, + zusatzzeile: input.zusatzzeile, verbrauchsausweis_gewerbe: { connect: { id: ausweis_id @@ -135,6 +161,19 @@ export const PUT = defineApiRoute({ betrag, bezahlmethode: bezahlmethode, status: Enums.Rechnungsstatus.open, + abweichende_versand_adresse: input.abweichende_versand_adresse, + email: input.email, + empfaenger: input.empfaenger, + ort: input.ort, + plz: input.plz, + strasse: input.strasse, + telefon: input.telefon, + versand_ort: input.versand_ort, + versand_empfaenger: input.versand_empfaenger, + versand_plz: input.versand_plz, + versand_strasse: input.versand_strasse, + versand_zusatzzeile: input.versand_zusatzzeile, + zusatzzeile: input.zusatzzeile, bedarfsausweis_wohnen: { connect: { id: ausweis_id -- 2.49.1 From 0956744878e87dcfa4a7024d9f90d84a651728e3 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Tue, 8 Apr 2025 19:34:51 -0400 Subject: [PATCH 13/23] Ausstellen --- src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 16 ++++--- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 8 +++- src/lib/pdf/utils/helpers.ts | 10 +++++ src/pages/api/admin/ausstellen.ts | 2 +- src/pages/api/admin/registriernummer.ts | 49 ++++++++++------------ 5 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index ab3d3b4a..4b02ac93 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -6,7 +6,7 @@ import moment from "moment"; import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib"; import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; -import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; +import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js"; @@ -612,12 +612,16 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe } - for (const page of pages) { - if (vorschau) { - addAnsichtsausweisLabel(page, font) + for (let i = 0; i < pages.length; i++) { + const page = pages[i]; + if (vorschau) { + addAnsichtsausweisLabel(page, font) + } + addDatumGEG(page, font) + if (i !== pages.length - 1) { + addRegistriernummer(page, font, ausweis.registriernummer || "") + } } - addDatumGEG(page, font) - } diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index 51701dff..55bb779e 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -6,7 +6,7 @@ import moment from "moment"; import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib"; import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; -import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; +import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js"; @@ -592,11 +592,15 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten) } - for (const page of pages) { + for (let i = 0; i < pages.length; i++) { + const page = pages[i]; if (vorschau) { addAnsichtsausweisLabel(page, font) } addDatumGEG(page, font) + if (i !== pages.length - 1) { + addRegistriernummer(page, font, ausweis.registriernummer || "") + } } return pdf.save(); diff --git a/src/lib/pdf/utils/helpers.ts b/src/lib/pdf/utils/helpers.ts index dd9d3655..07a7bd5b 100644 --- a/src/lib/pdf/utils/helpers.ts +++ b/src/lib/pdf/utils/helpers.ts @@ -22,3 +22,13 @@ export function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) { opacity: 0.3, }); } + + +export function addRegistriernummer(page: PDFPage, font: PDFFont, registriernummer: string) { + page.drawText(registriernummer, { + x: 435, + y: page.getHeight() - 113, + size: 10, + font, + }); +} \ No newline at end of file diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index 9fec4e32..efa13051 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -129,7 +129,7 @@ export const GET = defineApiRoute({ if (pdfDatenblatt) { const command = new PutObjectCommand({ Bucket: "ibc-pdfs", - Key: `ID_${ausweis.id}_Energieausweis.pdf`, + Key: `ID_${ausweis.id}_Datenblatt.pdf`, Body: pdfDatenblatt, ACL: "private", }); diff --git a/src/pages/api/admin/registriernummer.ts b/src/pages/api/admin/registriernummer.ts index c8a0d090..f8ceed75 100644 --- a/src/pages/api/admin/registriernummer.ts +++ b/src/pages/api/admin/registriernummer.ts @@ -122,32 +122,27 @@ export const GET = defineApiRoute({ ? "Energiebedarfsausweis" : "Energieverbrauchsausweis"; - const body = ` - - - - ${Aussteller_ID_DIBT} - ${Aussteller_PWD_DIBT} - - - ${Ausstellungsdatum} - ${postleitzahl.bundesland} - ${postleitzahl.plz} - ${Gesetzesgrundlage} - - - ${gebaeudeart} - ${art} - ${ - ausweis.ausstellgrund === - Enums.Ausstellgrund.Neubau - ? "1" - : "0" - } - - - - `; + const requestPayload = { + doc: { + root: { + Authentifizierung: { + Aussteller_ID_DIBT: Aussteller_ID_DIBT, + Aussteller_PWD_DIBT: Aussteller_PWD_DIBT, + }, + 'EnEV-Nachweis': { + Ausstellungsdatum: Ausstellungsdatum, + Bundesland: postleitzahl.bundesland, + Postleitzahl: postleitzahl.plz, + Gesetzesgrundlage: Gesetzesgrundlage, + }, + 'Energieausweis-Daten': { + Gebaeudeart: gebaeudeart, + Art: art, + Neubau: ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau ? "1" : "0", + }, + }, + }, + } return await new Promise(async (resolve, reject) => { soap.createClient( @@ -162,7 +157,7 @@ export const GET = defineApiRoute({ } client.Datenregistratur( - body, + requestPayload, async function ( err: any, result: { -- 2.49.1 From 7327d39c576e736022487e7ff072efc5adc738fd Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Wed, 9 Apr 2025 09:06:43 -0400 Subject: [PATCH 14/23] Ausweis ID im Ausweis --- src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 2 +- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index 4b02ac93..e768ce81 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -30,7 +30,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe const form = pdf.getForm() form.updateFieldAppearances(font) - pages[0].drawText(`ID: ${aufnahme.id || ""}`, { + pages[0].drawText(`ID: ${ausweis.id || ""}`, { x: 211, y: height - 112.5, size: 10 diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index 55bb779e..a2de2af6 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -28,7 +28,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne const font = await pdf.embedFont(StandardFonts.Helvetica) const bold = await pdf.embedFont(StandardFonts.HelveticaBold) - pages[0].drawText(`ID: ${aufnahme.id || ""}`, { + pages[0].drawText(`ID: ${ausweis.id || ""}`, { x: 211, y: height - 112.5, size: 10 -- 2.49.1 From 7665141a5ab064bab95213bdb0bd0d1b2468d580 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Wed, 9 Apr 2025 09:18:11 -0400 Subject: [PATCH 15/23] Formular Button --- src/components/Dashboard/DashboardAusweis.svelte | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/Dashboard/DashboardAusweis.svelte b/src/components/Dashboard/DashboardAusweis.svelte index 8fa08c8a..cb794393 100644 --- a/src/components/Dashboard/DashboardAusweis.svelte +++ b/src/components/Dashboard/DashboardAusweis.svelte @@ -409,6 +409,11 @@ class="button text-sm" href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}" >Formular
+ {:else if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen} + Formular {/if} {/if} -- 2.49.1 From 8daee69576d3d1be05f9591b3c56d5f5f137f18b Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Wed, 9 Apr 2025 11:46:27 -0400 Subject: [PATCH 16/23] Bugfixes --- .../20250409152238_ausweis_id/migration.sql | 17 ++ prisma/schema/BedarfsausweisGewerbe.prisma | 1 + prisma/schema/BedarfsausweisWohnen.prisma | 1 + prisma/schema/GEGNachweisGewerbe.prisma | 1 + prisma/schema/GEGNachweisWohnen.prisma | 1 + prisma/schema/VerbrauchsausweisGewerbe.prisma | 1 + prisma/schema/VerbrauchsausweisWohnen.prisma | 1 + src/client/lib/ausweisSpeichern.ts | 3 +- .../Ausweis/PerformanceScore.svelte | 14 +- .../Dashboard/DashboardAusweis.svelte | 1 - src/generated/zod/bedarfsausweisgewerbe.ts | 3 +- src/generated/zod/bedarfsausweiswohnen.ts | 3 +- src/generated/zod/gegnachweisgewerbe.ts | 3 +- src/generated/zod/gegnachweiswohnen.ts | 3 +- src/generated/zod/verbrauchsausweisgewerbe.ts | 3 +- src/generated/zod/verbrauchsausweiswohnen.ts | 3 +- src/lib/server/db.ts | 2 + src/lib/server/invoice.ts | 279 ++++++++++++------ src/modules/ImpersonateUserModule.svelte | 2 +- src/modules/KundendatenModule.svelte | 31 +- src/pages/api/admin/ausstellen.ts | 74 ++--- src/pages/api/bedarfsausweis-gewerbe/[id].ts | 5 +- src/pages/api/bedarfsausweis-gewerbe/index.ts | 3 +- src/pages/api/bedarfsausweis-wohnen/[id].ts | 7 +- src/pages/api/bedarfsausweis-wohnen/index.ts | 1 + src/pages/api/geg-nachweis-gewerbe/[id].ts | 5 +- src/pages/api/geg-nachweis-gewerbe/index.ts | 3 +- src/pages/api/geg-nachweis-wohnen/[id].ts | 3 +- src/pages/api/geg-nachweis-wohnen/index.ts | 3 +- .../api/verbrauchsausweis-gewerbe/[id].ts | 3 +- .../api/verbrauchsausweis-gewerbe/index.ts | 3 +- .../api/verbrauchsausweis-wohnen/[id].ts | 3 +- .../api/verbrauchsausweis-wohnen/index.ts | 3 +- .../dashboard/admin/impersonate-user.astro | 1 - src/pages/dashboard/admin/impersonate.astro | 11 +- 35 files changed, 307 insertions(+), 194 deletions(-) create mode 100644 prisma/migrations/20250409152238_ausweis_id/migration.sql diff --git a/prisma/migrations/20250409152238_ausweis_id/migration.sql b/prisma/migrations/20250409152238_ausweis_id/migration.sql new file mode 100644 index 00000000..eb2b5b04 --- /dev/null +++ b/prisma/migrations/20250409152238_ausweis_id/migration.sql @@ -0,0 +1,17 @@ +-- AlterTable +ALTER TABLE "BedarfsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisGewerbe'; + +-- AlterTable +ALTER TABLE "BedarfsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisWohnen'; + +-- AlterTable +ALTER TABLE "GEGNachweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisGewerbe'; + +-- AlterTable +ALTER TABLE "GEGNachweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisWohnen'; + +-- AlterTable +ALTER TABLE "VerbrauchsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisGewerbe'; + +-- AlterTable +ALTER TABLE "VerbrauchsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisWohnen'; diff --git a/prisma/schema/BedarfsausweisGewerbe.prisma b/prisma/schema/BedarfsausweisGewerbe.prisma index 476c21f7..bc4d983a 100644 --- a/prisma/schema/BedarfsausweisGewerbe.prisma +++ b/prisma/schema/BedarfsausweisGewerbe.prisma @@ -26,6 +26,7 @@ model BedarfsausweisGewerbe { klimatisierung Boolean? @default(false) nachweistyp AusweisTyp @default(Standard) + ausweisart Ausweisart @default(BedarfsausweisGewerbe) created_at DateTime @default(now()) updated_at DateTime @updatedAt @default(now()) diff --git a/prisma/schema/BedarfsausweisWohnen.prisma b/prisma/schema/BedarfsausweisWohnen.prisma index 3a05d2b5..e3074294 100644 --- a/prisma/schema/BedarfsausweisWohnen.prisma +++ b/prisma/schema/BedarfsausweisWohnen.prisma @@ -100,6 +100,7 @@ model BedarfsausweisWohnen { pruefpunkt_fenster Boolean? @default(false) ausweistyp AusweisTyp @default(Standard) + ausweisart Ausweisart @default(BedarfsausweisWohnen) benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) diff --git a/prisma/schema/GEGNachweisGewerbe.prisma b/prisma/schema/GEGNachweisGewerbe.prisma index 8bff4bdf..3a344706 100644 --- a/prisma/schema/GEGNachweisGewerbe.prisma +++ b/prisma/schema/GEGNachweisGewerbe.prisma @@ -17,6 +17,7 @@ model GEGNachweisGewerbe { beschreibung String? @db.Text nachweistyp AusweisTyp @default(Standard) + ausweisart Ausweisart @default(GEGNachweisGewerbe) created_at DateTime @default(now()) updated_at DateTime @updatedAt @default(now()) diff --git a/prisma/schema/GEGNachweisWohnen.prisma b/prisma/schema/GEGNachweisWohnen.prisma index 57a16db5..974b696c 100644 --- a/prisma/schema/GEGNachweisWohnen.prisma +++ b/prisma/schema/GEGNachweisWohnen.prisma @@ -17,6 +17,7 @@ model GEGNachweisWohnen { beschreibung String? @db.Text nachweistyp AusweisTyp @default(Standard) + ausweisart Ausweisart @default(GEGNachweisWohnen) created_at DateTime @default(now()) updated_at DateTime @updatedAt @default(now()) diff --git a/prisma/schema/VerbrauchsausweisGewerbe.prisma b/prisma/schema/VerbrauchsausweisGewerbe.prisma index 43811388..9281dd18 100644 --- a/prisma/schema/VerbrauchsausweisGewerbe.prisma +++ b/prisma/schema/VerbrauchsausweisGewerbe.prisma @@ -74,6 +74,7 @@ model VerbrauchsausweisGewerbe { updated_at DateTime @updatedAt @default(now()) ausweistyp AusweisTyp @default(Standard) + ausweisart Ausweisart @default(VerbrauchsausweisGewerbe) pruefpunkt_heizungsalter Boolean? @default(false) pruefpunkt_verbrauch_niedrig Boolean? @default(false) diff --git a/prisma/schema/VerbrauchsausweisWohnen.prisma b/prisma/schema/VerbrauchsausweisWohnen.prisma index a741aa90..2f93801c 100644 --- a/prisma/schema/VerbrauchsausweisWohnen.prisma +++ b/prisma/schema/VerbrauchsausweisWohnen.prisma @@ -75,6 +75,7 @@ model VerbrauchsausweisWohnen { kontrolldatei_angefragt Boolean? @default(false) ausweistyp AusweisTyp @default(Standard) + ausweisart Ausweisart @default(VerbrauchsausweisWohnen) created_at DateTime @default(now()) updated_at DateTime @updatedAt @default(now()) diff --git a/src/client/lib/ausweisSpeichern.ts b/src/client/lib/ausweisSpeichern.ts index 6362640d..3c93be7e 100644 --- a/src/client/lib/ausweisSpeichern.ts +++ b/src/client/lib/ausweisSpeichern.ts @@ -1,5 +1,4 @@ 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 { @@ -566,7 +565,7 @@ export async function ausweisSpeichern( return; } - aufnahme.id = aufnahme_id; + aufnahme.id = aufnahme_id as string; if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { const id = await verbrauchsausweisWohnenSpeichern( diff --git a/src/components/Ausweis/PerformanceScore.svelte b/src/components/Ausweis/PerformanceScore.svelte index a5dc68e0..5a40e520 100644 --- a/src/components/Ausweis/PerformanceScore.svelte +++ b/src/components/Ausweis/PerformanceScore.svelte @@ -1,5 +1,4 @@ -