From d2fac65a6d27e2f29ea13976f377ebb52ad33bec Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Sun, 20 Apr 2025 20:34:29 -0400 Subject: [PATCH] Bugfixes --- Makefile | 2 +- bun.lock | 4 +- src/astro-typesafe-api-caller.ts | 22 ++++---- .../pdfDatenblattVerbrauchsausweisGewerbe.ts | 19 +++---- .../pdfDatenblattVerbrauchsausweisWohnen.ts | 23 +++----- src/lib/server/ausweis.ts | 8 +-- src/lib/server/db.ts | 3 ++ src/pages/api/admin/ausstellen.ts | 7 ++- src/pages/api/admin/registriernummer.ts | 4 +- src/pages/dashboard/objekte/[page].astro | 10 +++- src/pages/pdf/datenblatt.ts | 32 ++++-------- wipe-database.bash | 52 +++++++++++++++++++ 12 files changed, 111 insertions(+), 75 deletions(-) create mode 100644 wipe-database.bash diff --git a/Makefile b/Makefile index d13b31fa..0e296ebd 100644 --- a/Makefile +++ b/Makefile @@ -68,4 +68,4 @@ prod: install-dependencies prisma-studio backup-database-cronjob backup-database-cronjob: - pm2 delete daily-db-backup - pm2 start backup-database.bash --name "daily-db-backup" --cron "0 0 * * *" \ No newline at end of file + pm2 start bash --name "daily-db-backup" --cron "0 0 * * *" -- backup-database.bash \ No newline at end of file diff --git a/bun.lock b/bun.lock index b67e6b59..4025e1f8 100644 --- a/bun.lock +++ b/bun.lock @@ -18,7 +18,7 @@ "@trpc/client": "^10.45.2", "@trpc/server": "^10.45.2", "astro": "^4.16.17", - "astro-typesafe-api": "^0.2.2", + "astro-typesafe-api": "^0.2.4", "body-scroll-lock": "^4.0.0-beta.0", "buffer": "^6.0.3", "bun": "^1.2.5", @@ -915,7 +915,7 @@ "astro": ["astro@4.16.18", "", { "dependencies": { "@astrojs/compiler": "^2.10.3", "@astrojs/internal-helpers": "0.4.1", "@astrojs/markdown-remark": "5.3.0", "@astrojs/telemetry": "3.1.0", "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx": "^7.25.9", "@babel/types": "^7.26.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.3", "@types/babel__core": "^7.20.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.1.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^0.7.2", "cssesc": "^3.0.0", "debug": "^4.3.7", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.5.4", "esbuild": "^0.21.5", "estree-walker": "^3.0.3", "fast-glob": "^3.3.2", "flattie": "^1.1.1", "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", "html-escaper": "^3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.14", "magicast": "^0.3.5", "micromatch": "^4.0.8", "mrmime": "^2.0.0", "neotraverse": "^0.6.18", "ora": "^8.1.1", "p-limit": "^6.1.0", "p-queue": "^8.0.1", "preferred-pm": "^4.0.0", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.6.3", "shiki": "^1.23.1", "tinyexec": "^0.3.1", "tsconfck": "^3.1.4", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3", "vite": "^5.4.11", "vitefu": "^1.0.4", "which-pm": "^3.0.0", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-G7zfwJt9BDHEZwlaLNvjbInIw2hPryyD654314KV/XT34pJU6SfN1S+mWa8RAkALcZNJnJXCJmT3JXLQStD3Lw=="], - "astro-typesafe-api": ["astro-typesafe-api@0.2.2", "", { "dependencies": { "es-codec": "^0.5.0", "globby": "^14.0.2" }, "peerDependencies": { "astro": "^4.16.17", "typescript": "^5.0.0", "zod": "^3.24.1" }, "bin": { "astro-typesafe-api": "src/cli.ts" } }, "sha512-SEHV2iPyIrdpYdYb0mIN1WmcvC61bvsCQqb/X+R4EOcFjuozJ9fJhSiFGxJMvNoxJ9S3P3GKLyDnxXvFlKq0mw=="], + "astro-typesafe-api": ["astro-typesafe-api@0.2.4", "", { "dependencies": { "es-codec": "^0.5.0", "globby": "^14.0.2" }, "peerDependencies": { "astro": "^4.16.17", "typescript": "^5.0.0", "zod": "^3.24.1" }, "bin": { "astro-typesafe-api": "src/cli.ts" } }, "sha512-KiAw7+QJyuzz606GSkeaTdav8vttDUEYVaFAdVRlDuSvUdhcYsJB14zHkMe6ZSMfRNBQRxaMZBgPgEtWb1mf1w=="], "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index a57d288b..83fb19ee 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -11,31 +11,31 @@ export const createCaller = createCallerFactory({ "admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"), "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), + "bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"), + "bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"), + "aufnahme": await import("../src/pages/api/aufnahme/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"), "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"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "ausweise": await import("../src/pages/api/ausweise/index.ts"), - "bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"), - "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), - "bilder/[id]": await import("../src/pages/api/bilder/[id].ts"), - "bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"), - "bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.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"), - "objekt": await import("../src/pages/api/objekt/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"), + "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"), + "bilder/[id]": await import("../src/pages/api/bilder/[id].ts"), "ticket": await import("../src/pages/api/ticket/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"), + "verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"), + "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "user": await import("../src/pages/api/user/index.ts"), "user/self": await import("../src/pages/api/user/self.ts"), "verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"), "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), - "verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"), - "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/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"), diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts index 05811876..ee108959 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts @@ -3,13 +3,13 @@ import * as fs from "fs" 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 { Enums, Heizungsstatus, Rechnung } from "#lib/server/prisma.js"; import { copyPage } from "./utils/copyPage.js"; import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js"; /* -------------------------------- Pdf Tools ------------------------------- */ -export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: BildClient[]) { +export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, rechnung: Rechnung | null, bilder: BildClient[]) { const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64"); const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const page3 = copyPage(pdf.getPages()[0]); @@ -32,14 +32,6 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa const marginX = 60; const marginY = 150; - benutzer = benutzer || { - vorname: "Max", - name: "Mustermann", - adresse: "Musterstraße 123", - plz: "12345", - ort: "Beispielhausen" - }; - const translateHeizungsstatus: Record = { BEHEIZT: "beheizt", NICHT_VORHANDEN: "nicht vorhanden", @@ -70,9 +62,10 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa } const layout = xml2pdf(` - ${benutzer.vorname} ${benutzer.name} - ${benutzer.adresse} - ${benutzer.plz} ${benutzer.ort} + ${rechnung?.versand_empfaenger} + ${rechnung?.versand_zusatzzeile} + ${rechnung?.versand_strasse} + ${rechnung?.versand_plz} ${rechnung?.versand_ort} Datenblatt Energieausweis Ausweis ID: ${ausweis.id} diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts index 9afa1bcf..0454a3b7 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts @@ -1,16 +1,15 @@ -import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; -import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; +import { AufnahmeClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import * as fs from "fs" 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 { Enums, Heizungsstatus, Rechnung } 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 ------------------------------- */ -export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: BildClient[]) { +export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, rechnung: Rechnung | null, bilder: BildClient[]) { const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64"); const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const page3 = copyPage(pdf.getPages()[0]); @@ -34,15 +33,6 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau const marginX = 60; const marginY = 150; - benutzer = benutzer || { - firma: "Max Mustermann GmbH", - vorname: "Max", - name: "Mustermann", - adresse: "Musterstraße 123", - plz: "12345", - ort: "Beispielhausen" - }; - const translateHeizungsstatus: Record = { BEHEIZT: "beheizt", NICHT_VORHANDEN: "nicht vorhanden", @@ -54,9 +44,10 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau const id = ausweis.id; const layout = xml2pdf(` - ${benutzer.firma} - ${benutzer.adresse} - ${benutzer.plz} ${benutzer.ort} + ${rechnung?.versand_empfaenger} + ${rechnung?.versand_zusatzzeile} + ${rechnung?.versand_strasse} + ${rechnung?.versand_plz} ${rechnung?.versand_ort} Datenblatt Energieausweis Ausweis ID: ${id} diff --git a/src/lib/server/ausweis.ts b/src/lib/server/ausweis.ts index d92a1896..7fb2b98c 100644 --- a/src/lib/server/ausweis.ts +++ b/src/lib/server/ausweis.ts @@ -3,7 +3,7 @@ import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVer import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js"; import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js"; import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js"; -import { Enums, prisma } from "#lib/server/prisma.js"; +import { Enums, prisma, Rechnung } from "#lib/server/prisma.js"; /** * Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID. @@ -49,15 +49,15 @@ export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient * Gibt das richtige Datenblatt basierend auf der Ausweisart zurück. * @param ausweis */ -export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromId(ausweis.id)) { +export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, rechnung: Rechnung, ausweisart = getAusweisartFromId(ausweis.id)) { if (!ausweisart) { return null } if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { - return await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, user, bilder) + return await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, rechnung, bilder) } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { - return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, user, bilder) + return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, rechnung, bilder) } return null diff --git a/src/lib/server/db.ts b/src/lib/server/db.ts index 23dfacb6..0a0a7f71 100644 --- a/src/lib/server/db.ts +++ b/src/lib/server/db.ts @@ -24,6 +24,7 @@ export async function getVerbrauchsausweisWohnenKomplett(id: string) { }, }, }, + rechnung: true }, }) } @@ -54,6 +55,7 @@ export async function getVerbrauchsausweisGewerbeKomplett(id: string) { }, }, }, + rechnung: true }, }) } @@ -82,6 +84,7 @@ export async function getBedarfsausweisWohnenKomplett(id: string) { }, }, }, + rechnung: true }, }) } diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index acc9cd27..bac3e422 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -8,6 +8,7 @@ import { Enums, Objekt, prisma, + Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen, } from "#lib/server/prisma.js"; @@ -50,7 +51,8 @@ export const GET = defineApiRoute({ objekt: Objekt & { benutzer: Benutzer | null; }; - }; + }, + rechnung: Rechnung }) | null = null; @@ -131,7 +133,8 @@ export const GET = defineApiRoute({ ausweis.aufnahme, ausweis.aufnahme.objekt, ausweis.aufnahme.bilder, - ausweis.aufnahme.objekt.benutzer + ausweis.aufnahme.objekt.benutzer, + ausweis.rechnung ); // TODO: Das ist immer noch scheiße, LexOffice ist doof diff --git a/src/pages/api/admin/registriernummer.ts b/src/pages/api/admin/registriernummer.ts index f8ceed75..bf3f3ddc 100644 --- a/src/pages/api/admin/registriernummer.ts +++ b/src/pages/api/admin/registriernummer.ts @@ -194,9 +194,7 @@ export const GET = defineApiRoute({ .Registriernummer, kontrolldatei_angefragt: result .DatenregistraturResult - .WEB_Service_Antwort.Datendatei - ? true - : false, + .WEB_Service_Antwort.Datendatei == 0 ? false : true, }, }); diff --git a/src/pages/dashboard/objekte/[page].astro b/src/pages/dashboard/objekte/[page].astro index b831e143..976516c6 100644 --- a/src/pages/dashboard/objekte/[page].astro +++ b/src/pages/dashboard/objekte/[page].astro @@ -83,7 +83,10 @@ if (id) { unterlagen: true, bedarfsausweise_wohnen: true, verbrauchsausweise_gewerbe: true, - verbrauchsausweise_wohnen: true + verbrauchsausweise_wohnen: true, + bedarfsausweise_gewerbe: true, + geg_nachweise_gewerbe: true, + geg_nachweise_wohnen: true } } }, @@ -145,7 +148,10 @@ if (id) { unterlagen: true, bedarfsausweise_wohnen: true, verbrauchsausweise_gewerbe: true, - verbrauchsausweise_wohnen: true + verbrauchsausweise_wohnen: true, + bedarfsausweise_gewerbe: true, + geg_nachweise_gewerbe: true, + geg_nachweise_wohnen: true } } }, diff --git a/src/pages/pdf/datenblatt.ts b/src/pages/pdf/datenblatt.ts index 87d22974..2866f4e4 100644 --- a/src/pages/pdf/datenblatt.ts +++ b/src/pages/pdf/datenblatt.ts @@ -2,11 +2,11 @@ import { BenutzerClient, getAusweisartFromId, VerbrauchsausweisGewerbeClient, Ve import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js"; import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js"; -import { Aufnahme, Benutzer, Bild, Enums, Objekt, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js"; +import { Aufnahme, Benutzer, Bild, Enums, Objekt, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js"; import { APIRoute } from "astro"; import { createCaller } from "src/astro-typesafe-api-caller.js"; import { getS3File } from "#lib/s3.js"; -import { getAufnahme, getBilder, getObjekt, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db.js"; +import { getAufnahme, getBilder, getObjekt, getRechnung, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db.js"; import { getCurrentUser } from "#lib/server/user.js"; export const GET: APIRoute = async (Astro) => { @@ -21,8 +21,8 @@ export const GET: APIRoute = async (Astro) => { let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null; let aufnahme: Aufnahme = {} as Aufnahme; let objekt: Objekt = {} as Objekt; - let user: Benutzer = {} as Benutzer; let bilder: Bild[] = [] + let rechnung: Rechnung | null = null; if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { ausweis = await getVerbrauchsausweisWohnen(ausweis_id) @@ -43,15 +43,19 @@ export const GET: APIRoute = async (Astro) => { user = await getCurrentUser(Astro) + if (ausweis.rechnung_id) { + rechnung = await getRechnung(ausweis.rechnung_id) + } + let pdf: Uint8Array | null = null; if (/[A-Z]{2}[0-9]{8}/.test(ausweis.id)) { const id = ausweis.id.match(/[A-Z]{2}([0-9]{8})/) as RegExpMatchArray // Dieser Ausweis wurde mit der alten Version erstellt, das PDF sollte bereits existieren. pdf = await getS3File("ibc-pdfs", `ID_${id[1]}_Datenblatt.pdf`) } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { - pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, user, bilder); + pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, rechnung, bilder); } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { - pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, user, bilder); + pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, rechnung, bilder); } return new Response(pdf, { @@ -65,31 +69,17 @@ export const POST: APIRoute = async (Astro) => { const body = await Astro.request.text(); const params = new URLSearchParams(body); - const caller = createCaller(Astro); - const ausweis = JSON.parse(params.get("ausweis") || "{}"); const aufnahme = JSON.parse(params.get("aufnahme") || "{}"); const objekt = JSON.parse(params.get("objekt") || "{}"); const bilder = JSON.parse(params.get("bilder") || "{}"); const ausweisart: Enums.Ausweisart = JSON.parse(params.get("ausweisart") || "") - let user: BenutzerClient = {}; - - try { - user = await caller.user.self.GET.fetch(undefined, { - headers: { - Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - } - }); - } catch (e) { - - } - let pdf: Uint8Array | null = null; if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { - pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, user, bilder); + pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, null, bilder); } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { - pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, user, bilder); + pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, null, bilder); } return new Response(pdf, { diff --git a/wipe-database.bash b/wipe-database.bash new file mode 100644 index 00000000..b25a5c46 --- /dev/null +++ b/wipe-database.bash @@ -0,0 +1,52 @@ +#!/bin/bash + +set -e + +# Config +CONTAINER_NAME="online-energieausweis-database-1" +DB_USER="main" +DB_NAME="main" +TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S") +FILE_NAME="backup-$TIMESTAMP.sql.br" + +REQUIRED_CONFIRMATION='Ja, ich möchte alle Daten unwiderruflich löschen.' + +echo "⚠️ WARNUNG: Diese Aktion wird alle Tabellen und Einträge in der Datenbank vollständig löschen!" +echo "Um fortzufahren, tippe exakt: \"$REQUIRED_CONFIRMATION\"" +echo +read -p "> " USER_CONFIRMATION + +if [[ "$USER_CONFIRMATION" != "$REQUIRED_CONFIRMATION" ]]; then + echo "❌ Falsche Eingabe. Abbruch." + exit 1 +fi + +echo "📦 Backup wird erstellt..." +docker exec -t "$CONTAINER_NAME" pg_dumpall -c -U "$DB_USER" | brotli > "$FILE_NAME" +echo "✅ Backup abgeschlossen: $FILE_NAME" + +echo "🧨 Alle Daten aus allen Tabellen werden gelöscht..." + +# Generate and run TRUNCATE statements for all tables in the public schema +docker exec -i "$CONTAINER_NAME" psql -U "$DB_USER" "$DB_NAME" <<'EOSQL' +DO $$ +DECLARE + r RECORD; + sql TEXT := ''; +BEGIN + FOR r IN + SELECT tablename + FROM pg_tables + WHERE schemaname = 'public' + LOOP + sql := sql || FORMAT('TRUNCATE TABLE public.%I CASCADE;', r.tablename); + END LOOP; + + EXECUTE sql; +END +$$; +EOSQL + +echo "✅ Alle Tabellen gelöscht und Schema zurückgesetzt." + +echo "🚀 Datenbankbereinigung abgeschlossen." \ No newline at end of file