From df00cb88e299168b3270d0b8849d2b9a28951390 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Wed, 19 Feb 2025 11:11:24 +1100 Subject: [PATCH 1/3] Verbrauchsausweis Gewerbe --- src/astro-typesafe-api-caller.ts | 10 +- src/components/Ausweis/types.ts | 4 +- .../VerbrauchsausweisGewerbe_2016.ts | 5 +- src/lib/altes-system/import.ts | 2 +- src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 246 ++++++++++++++---- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 27 +- src/lib/pdf/utils/helpers.ts | 24 ++ src/lib/validators/index.ts | 20 +- src/modules/Dashboard/DashboardModule.svelte | 14 +- src/pages/api/admin/ausstellen.ts | 4 +- src/pages/api/bedarfsausweis-wohnen/index.ts | 2 +- src/pages/api/bilder/[uid].ts | 8 +- .../index.ts | 2 +- src/pages/api/objekt/[uid]/bilder.ts | 14 +- .../api/verbrauchsausweis-gewerbe/index.ts | 2 +- .../api/verbrauchsausweis-wohnen/index.ts | 2 +- src/pages/bilder/[uid].webp.ts | 4 +- src/pages/dashboard/ausweise-pruefen.astro | 6 +- src/pages/dashboard/index.astro | 28 +- 19 files changed, 291 insertions(+), 133 deletions(-) create mode 100644 src/lib/pdf/utils/helpers.ts diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index f2a456e9..2059e34b 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -3,27 +3,27 @@ import { createCallerFactory } from "astro-typesafe-api/server"; export const createCaller = createCallerFactory({ "klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"), "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), + "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), - "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), + "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "geg-nachweis-verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/[uid].ts"), "geg-nachweis-verbrauchsausweis-wohnen": await import("../src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/index.ts"), - "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "objekt": await import("../src/pages/api/objekt/index.ts"), - "ticket": await import("../src/pages/api/ticket/index.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-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), + "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), - "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), - "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), "objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"), "objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"), "objekt/[uid]/unterlagen": await import("../src/pages/api/objekt/[uid]/unterlagen.ts"), diff --git a/src/components/Ausweis/types.ts b/src/components/Ausweis/types.ts index ddc77842..d4858bec 100644 --- a/src/components/Ausweis/types.ts +++ b/src/components/Ausweis/types.ts @@ -4,7 +4,7 @@ import { BedarfsausweisWohnen, Benutzer, Enums, - GebaeudeBilder, + Bild, Objekt, Rechnung, Tickets, @@ -16,7 +16,7 @@ import { z, ZodSchema } from "zod"; export type OmitKeys = Omit; -export type UploadedGebaeudeBild = OmitKeys & { +export type UploadedGebaeudeBild = OmitKeys & { base64: string } diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts index 672bdd1c..d1fd3b49 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts @@ -135,13 +135,10 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: energieVerbrauchWarmwasser_2 = 0; } - let kuehlungsZuschlag_1: number; - let kuehlungsZuschlag_2: number; + let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; if (ausweis.wird_gekuehlt) { kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100); kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100); - } else { - kuehlungsZuschlag_1 = kuehlungsZuschlag_2 = 0; } // Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden. diff --git a/src/lib/altes-system/import.ts b/src/lib/altes-system/import.ts index 2cfff4bc..8752ac26 100644 --- a/src/lib/altes-system/import.ts +++ b/src/lib/altes-system/import.ts @@ -43,7 +43,7 @@ export function verbrauchsausweisWohnenImportTranslate(ausweis: Record`, { - x, - y, - scale: 0.4, - color: rgb(0,0,0) - }) - } if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) { - checkbox(pages[0], 213, height - 334) + addCheckMark(pages[0], 213, height - 334) } else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) { - checkbox(pages[0], 213, height - 345) + addCheckMark(pages[0], 213, height - 345) } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) { - checkbox(pages[0], 355, height - 334) + addCheckMark(pages[0], 355, height - 334) } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) { - checkbox(pages[0], 355, height - 345) + addCheckMark(pages[0], 355, height - 345) } + // Kühlung + if (ausweis.wird_gekuehlt) { + addCheckMark(pages[0], 213, height - 362.5) + } else { + addCheckMark(pages[0], 355, height - 373.5) + } + + if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) { + addCheckMark(pages[0], 213, height - 406) + } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung) { + addCheckMark(pages[0], 213, height - 417) + } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) { + addCheckMark(pages[0], 344.5, height - 406) + } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) { + addCheckMark(pages[0], 463, height - 417) + } + // Aushangpflicht + // addCheckMark(pages[0], 463, height - 406) + + + const gebaeudeBild = bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude); @@ -131,6 +171,51 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe }) } + // Checkmark Angabe energetische Qualität des Gebäudes. + addCheckMark(pages[0], 40, height - 550) + + // Datenerhebung durch Eigentümer + addCheckMark(pages[0], 295, height - 580) + + // Ausstellungsdatum + pages[0].drawText(moment().format("DD.MM.YYYY"), { + font, + size: 10, + x: 508, + y: height - 752 + }) + + // Gültig bis + pages[0].drawText(moment().add(10, "years").format("DD.MM.YYYY"), { + font: bold, + size: 10, + x: 90, + y: height - 113 + }) + + // Stempel und Unterschrift + if (ausweis.ausgestellt) { + const stempel = await pdf.embedPng(fs.readFileSync(new URL("./images/stempel-unterschrift.png", import.meta.url), "base64")); + const stempelHeight = 60 + + pages[0].drawImage(stempel, { + x: 450, + y: height - 750, + height: stempelHeight, + width: stempel.width / (stempel.height / stempelHeight) + }) + } + + + // Aussteller + const aussteller = await pdf.embedPng(fs.readFileSync(new URL("./images/aussteller.png", import.meta.url), "base64")); + pages[0].drawImage(aussteller, { + x: 40, + y: height - 750, + width: 100, + height: 50 + }) + // /* -------------------------------- Seite 2 -------------------------------- */ @@ -138,95 +223,128 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => { const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64")) - const pfeilNachOben = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-oben.png", import.meta.url), "base64")) // Wir müssen den berechneten Wert zwischen 0 und 1000 als Wert zwischen 0 und 1 festlegen const endenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 1000 - const primaerenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt || 0)) / 1000 + const stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000 - const minTranslation = 120 - const maxTranslation = 457 + const minTranslation = 78 + const maxTranslation = 512 const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage; - const primaerenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * primaerenergieverbrauchTranslationPercentage; + const stromVerbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * stromVerbrauchTranslationPercentage; const pfeilWidth = 20 const margin = 5; page.drawImage(pfeilNachUnten, { x: endenergieverbrauchTranslationX, - y: height - 215, + y: height - 210, width: pfeilWidth, height: 30 }) const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; - const primaerEnergieVerbrauchGesamtText = `${berechnungen?.primaerEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; + const stromVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchStrom.toString()}kWh/(m²a)`; if (endenergieverbrauchTranslationPercentage > 0.5) { - page.drawText("Endenergieverbrauch", { + page.drawText("Endenergieverbrauch Wärme", { x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10), - y: height - 193, + y: height - 191, size: 10 }) page.drawText(endEnergieVerbrauchGesamtText, { x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10), - y: height - 207, + y: height - 205, size: 10, font: bold }) } else { - page.drawText("Endenergieverbrauch", { + page.drawText("Endenergieverbrauch Wärme", { x: endenergieverbrauchTranslationX + pfeilWidth + margin, - y: height - 193, + y: height - 191, size: 10 }) page.drawText(endEnergieVerbrauchGesamtText, { x: endenergieverbrauchTranslationX + pfeilWidth + margin, - y: height - 207, + y: height - 205, size: 10, font: bold }) } - page.drawImage(pfeilNachOben, { - x: primaerenergieverbrauchTranslationX, - y: height - 298, + page.drawImage(pfeilNachUnten, { + x: stromVerbrauchTranslationX, + y: height - 354, width: pfeilWidth, height: 30 }) if (endenergieverbrauchTranslationPercentage > 0.5) { - page.drawText("Primärenergieverbrauch", { - x: primaerenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10), - y: height - 280, + page.drawText("Endenergieverbrauch Strom", { + x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10), + y: height - 335, size: 10 }) - page.drawText(primaerEnergieVerbrauchGesamtText, { - x: primaerenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(primaerEnergieVerbrauchGesamtText, 10), - y: height - 294, + page.drawText(stromVerbrauchGesamtText, { + x: stromVerbrauchTranslationX - margin - bold.widthOfTextAtSize(stromVerbrauchGesamtText, 10), + y: height - 349, size: 10, font: bold }) } else { - page.drawText("Primärenergieverbrauch", { - x: primaerenergieverbrauchTranslationX + pfeilWidth + margin, - y: height - 280, + page.drawText("Endenergieverbrauch Strom", { + x: stromVerbrauchTranslationX + pfeilWidth + margin, + y: height - 335, size: 10 }) - page.drawText(primaerEnergieVerbrauchGesamtText, { - x: primaerenergieverbrauchTranslationX + pfeilWidth + margin, - y: height - 294, + page.drawText(stromVerbrauchGesamtText, { + x: stromVerbrauchTranslationX + pfeilWidth + margin, + y: height - 349, size: 10, font: bold }) } } - addEnergieverbrauchSkalaPfeile(pages[1]) addEnergieverbrauchSkalaPfeile(pages[2]) + if (ausweis.warmwasser_enthalten) { + addCheckMark(pages[2], 41, height - 269) + } + + if (ausweis.kuehlung_enthalten) { + addCheckMark(pages[2], 41, height - 281) + } + + if (ausweis.stromverbrauch_enthaelt_heizung) { + addCheckMark(pages[2], 41, height - 456) + } + + if (ausweis.stromverbrauch_enthaelt_warmwasser) { + addCheckMark(pages[2], 131, height - 456) + } + + if (ausweis.stromverbrauch_enthaelt_lueftung) { + addCheckMark(pages[2], 218, height - 456) + } + + if (ausweis.stromverbrauch_enthaelt_beleuchtung) { + addCheckMark(pages[2], 281, height - 456) + } + + if (ausweis.stromverbrauch_enthaelt_kuehlung) { + addCheckMark(pages[2], 422, height - 456) + } + + if (ausweis.stromverbrauch_enthaelt_sonstige) { + addCheckMark(pages[2], 492, height - 456) + } + + addText(pages[2], berechnungen?.primaerEnergieVerbrauchGesamt.toString() || "", 475, height - 614, 10, font) + addText(pages[2], berechnungen?.co2EmissionenGesamt.toString() || "", 475, height - 633, 10, font) + // const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString()) @@ -237,9 +355,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe const addVerbrauchGenerator = () => { let i = 0; let yOffset = 14.6; - const initialHeight = 435 + const initialHeight = 297 const initialXOffset = 36; - return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_heizung?: string, klimafaktor?: string) => { + return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_kaelte?: number, anteil_heizung?: string, klimafaktor?: string, strom?: number) => { pages[2].drawText(zeitraum_von || "", { x: initialXOffset, y: initialHeight - (i * yOffset), @@ -262,34 +380,48 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe }) pages[2].drawText(primaerfaktor || "", { - x: initialXOffset + 317, + x: initialXOffset + 232, y: initialHeight - (i * yOffset), size: 8, font }) pages[2].drawText(energieverbrauch || "", { - x: initialXOffset + 351, + x: initialXOffset + 275, y: initialHeight - (i * yOffset), size: 8, font }) pages[2].drawText(anteil_warmwasser || "", { - x: initialXOffset + 402, + x: initialXOffset + 325, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(anteil_kaelte?.toString() || "", { + x: initialXOffset + 378, y: initialHeight - (i * yOffset), size: 8, font }) pages[2].drawText(anteil_heizung || "", { - x: initialXOffset + 453, + x: initialXOffset + 430, y: initialHeight - (i * yOffset), size: 8, font }) pages[2].drawText(klimafaktor || "", { + x: initialXOffset + 464, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(strom?.toString() || "", { x: initialXOffset + 504, y: initialHeight - (i * yOffset), size: 8, @@ -310,8 +442,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), "0", + berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1, Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(), - berechnungen?.durchschnittsKlimafaktor.toString() + berechnungen?.durchschnittsKlimafaktor.toString(), + berechnungen?.energieVerbrauchStrom ); } else { // Ohne Warmwasserzuschlag @@ -322,8 +456,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(), + berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1, Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(), - berechnungen?.durchschnittsKlimafaktor.toString() + berechnungen?.durchschnittsKlimafaktor.toString(), + berechnungen?.energieVerbrauchStrom ); } @@ -335,8 +471,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe berechnungen?.brennstoff_2.primaerenergiefaktor.toString(), Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(), Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(), + berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_2, Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(), - berechnungen?.durchschnittsKlimafaktor.toString() + berechnungen?.durchschnittsKlimafaktor.toString(), + 0 ); } @@ -415,6 +553,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe } + for (const page of pages) { + addAnsichtsausweisLabel(page, font) + addDatumGEG(page, font) + } + + // pdf.getForm().flatten() diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index 2bb508fc..5eb2a0a5 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -7,6 +7,7 @@ import moment from "moment"; import { PDFDocument, PDFFont, PDFImage, PDFPage, RotationTypes, StandardFonts, TextAlignment } from "pdf-lib"; import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; +import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -93,6 +94,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne }) } + // Nach 82 aus Wohnfläche ermittelt if (aufnahme.flaeche == 0) { addCheckMark(pages[0], 274, height - 277) } @@ -120,8 +122,6 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne }) // Stempel und Unterschrift - - // TODO: ausweis.erledigt if (ausweis.ausgestellt) { const stempel = await pdf.embedPng(fs.readFileSync(new URL("./images/stempel-unterschrift.png", import.meta.url), "base64")); const stempelHeight = 60 @@ -517,29 +517,6 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne for (const empfehlung of empfehlungen) { addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten) } - - - function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) { - page.drawText("Ansichtsausweis", { - x: page.getWidth() / 2 - font.heightAtSize(112) * 2.2, y: page.getHeight() - font.heightAtSize(112) / 2, - size: 112, - font, - rotate: { - type: RotationTypes.Degrees, - angle: -60 - }, - opacity: 0.3 - }) - } - - function addDatumGEG(page: PDFPage, font: PDFFont) { - page.drawText("20. Juli 2022", { - x: 308, - y: page.getHeight() - 70, - size: 10, - font - }) - } for (const page of pages) { addAnsichtsausweisLabel(page, font) diff --git a/src/lib/pdf/utils/helpers.ts b/src/lib/pdf/utils/helpers.ts new file mode 100644 index 00000000..dd9d3655 --- /dev/null +++ b/src/lib/pdf/utils/helpers.ts @@ -0,0 +1,24 @@ +import { PDFPage, PDFFont, RotationTypes } from "pdf-lib"; + +export function addDatumGEG(page: PDFPage, font: PDFFont) { + page.drawText("20. Juli 2022", { + x: 308, + y: page.getHeight() - 70, + size: 10, + font, + }); +} + +export function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) { + page.drawText("Ansichtsausweis", { + x: page.getWidth() / 2 - font.heightAtSize(112) * 2.2, + y: page.getHeight() - font.heightAtSize(112) / 2, + size: 112, + font, + rotate: { + type: RotationTypes.Degrees, + angle: -60, + }, + opacity: 0.3, + }); +} diff --git a/src/lib/validators/index.ts b/src/lib/validators/index.ts index fb89fafd..63bd961a 100644 --- a/src/lib/validators/index.ts +++ b/src/lib/validators/index.ts @@ -2,7 +2,7 @@ import { VerbrauchsausweisWohnenSchema, AufnahmeSchema, ObjektSchema, - GebaeudeBilderSchema, + BildSchema, RechnungSchema, EventSchema, BenutzerSchema, @@ -30,7 +30,7 @@ export const AnteilshaberValidator = AnteilshaberSchema.omit({ objekt_id: true }) -export const GebaeudeBilderValidator = GebaeudeBilderSchema.omit({ +export const BildValidator = BildSchema.omit({ id: true, objekt_id: true }) @@ -79,8 +79,8 @@ export const ObjektValidator = ObjektSchema.omit({ aufnahme: z.array( AufnahmeValidator ).nullable().optional(), - gebaeude_bilder: z.array( - GebaeudeBilderValidator + bilder: z.array( + BildValidator ).nullable().optional(), gebaeude_plaene: z.array( GebaeudePlaeneValidator @@ -112,8 +112,8 @@ export const VerbrauchsausweisWohnenValidator = id: true, }).merge( z.object({ - gebaeude_bilder: z.array( - GebaeudeBilderSchema.omit({ + bilder: z.array( + BildSchema.omit({ id: true, objekt_id: true, }) @@ -170,8 +170,8 @@ BedarfsausweisWohnenSchema.merge( id: true, }).merge( z.object({ - gebaeude_bilder: z.array( - GebaeudeBilderSchema.omit({ + bilder: z.array( + BildSchema.omit({ id: true, objekt_id: true, }) @@ -221,8 +221,8 @@ export const VerbrauchsausweisGewerbeValidator = id: true, }).merge( z.object({ - gebaeude_bilder: z.array( - GebaeudeBilderSchema.omit({ + bilder: z.array( + BildSchema.omit({ id: true, objekt_id: true, }) diff --git a/src/modules/Dashboard/DashboardModule.svelte b/src/modules/Dashboard/DashboardModule.svelte index 8c7f4793..bf26aacf 100644 --- a/src/modules/Dashboard/DashboardModule.svelte +++ b/src/modules/Dashboard/DashboardModule.svelte @@ -1,8 +1,12 @@

Willkommen zurück, {user.vorname}!

@@ -12,11 +16,11 @@

Gebäude

- +{/each}
\ No newline at end of file diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index 91ec6b74..6223cd51 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -29,7 +29,7 @@ export const GET = defineApiRoute({ include: { objekt: { include: { - gebaeude_bilder: true, + bilder: true, benutzer: true, }, }, @@ -88,7 +88,7 @@ export const GET = defineApiRoute({ ausweis, ausweis.aufnahme, ausweis.aufnahme.objekt, - ausweis.aufnahme.objekt.gebaeude_bilder, + ausweis.aufnahme.objekt.bilder, ausweis.aufnahme.objekt.benutzer ); const pdfDatenblatt = await pdfDatenblattVerbrauchsausweisWohnen( diff --git a/src/pages/api/bedarfsausweis-wohnen/index.ts b/src/pages/api/bedarfsausweis-wohnen/index.ts index 8aca276c..ecebf20c 100644 --- a/src/pages/api/bedarfsausweis-wohnen/index.ts +++ b/src/pages/api/bedarfsausweis-wohnen/index.ts @@ -109,7 +109,7 @@ export const GET = defineApiRoute({ include: { objekt: { include: { - gebaeude_bilder: true, + bilder: true, }, }, rechnungen: true, diff --git a/src/pages/api/bilder/[uid].ts b/src/pages/api/bilder/[uid].ts index eaa8afb6..ae786af2 100644 --- a/src/pages/api/bilder/[uid].ts +++ b/src/pages/api/bilder/[uid].ts @@ -1,5 +1,5 @@ import { authorizationMiddleware } from "#lib/middleware/authorization.js"; -import { GebaeudeBilderSchema, prisma } from "@ibcornelsen/database/server"; +import { BildSchema, prisma } from "@ibcornelsen/database/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { z } from "zod"; import isBase64 from "is-base64"; @@ -8,7 +8,7 @@ import { writeFileSync } from "fs"; import { UUidWithPrefix } from "#components/Ausweis/types.js"; export const PATCH = defineApiRoute({ - input: GebaeudeBilderSchema.pick({ + input: BildSchema.pick({ kategorie: true, }).merge(z.object({ base64: z.string() @@ -23,7 +23,7 @@ export const PATCH = defineApiRoute({ }) } - const image = await prisma.gebaeudeBilder.findUnique({ + const image = await prisma.Bild.findUnique({ where: { uid: ctx.params.uid, objekt: { @@ -55,7 +55,7 @@ export const PATCH = defineApiRoute({ const buffer = Buffer.from(dataWithoutPrefix, "base64"); if (input.kategorie !== image.kategorie) { - await prisma.gebaeudeBilder.update({ + await prisma.Bild.update({ where: { id: image.id }, diff --git a/src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/index.ts b/src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/index.ts index 701ad9f8..c1df057b 100644 --- a/src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/index.ts +++ b/src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/index.ts @@ -109,7 +109,7 @@ export const GET = defineApiRoute({ include: { objekt: { include: { - gebaeude_bilder: true, + bilder: true, }, }, rechnungen: true, diff --git a/src/pages/api/objekt/[uid]/bilder.ts b/src/pages/api/objekt/[uid]/bilder.ts index 2f478df3..72acb3fe 100644 --- a/src/pages/api/objekt/[uid]/bilder.ts +++ b/src/pages/api/objekt/[uid]/bilder.ts @@ -1,5 +1,5 @@ import { authorizationMiddleware } from "#lib/middleware/authorization.js"; -import { GebaeudeBilderSchema, prisma } from "@ibcornelsen/database/server"; +import { BildSchema, prisma } from "@ibcornelsen/database/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { z } from "zod"; import isBase64 from "is-base64"; @@ -7,7 +7,7 @@ import { fileURLToPath } from "url"; import { writeFileSync } from "fs"; export const PUT = defineApiRoute({ - input: GebaeudeBilderSchema.pick({ + input: BildSchema.pick({ kategorie: true, }).merge(z.object({ base64: z.string() @@ -46,7 +46,7 @@ export const PUT = defineApiRoute({ ); const buffer = Buffer.from(dataWithoutPrefix, "base64"); - const bild = await prisma.gebaeudeBilder.create({ + const bild = await prisma.Bild.create({ data: { kategorie: input.kategorie, objekt: { @@ -72,7 +72,7 @@ export const PUT = defineApiRoute({ console.log(e); // Bild wurde nicht gespeichert, wir löschen den Eintrag wieder - await prisma.gebaeudeBilder.delete({ + await prisma.Bild.delete({ where: { uid: bild.uid } @@ -92,7 +92,7 @@ export const PUT = defineApiRoute({ export const GET = defineApiRoute({ middleware: authorizationMiddleware, - output: z.array(GebaeudeBilderSchema.pick({ + output: z.array(BildSchema.pick({ kategorie: true, uid: true })), @@ -106,7 +106,7 @@ export const GET = defineApiRoute({ }, select: { benutzer_id: true, - gebaeude_bilder: { + bilder: { select: { kategorie: true, uid: true @@ -122,6 +122,6 @@ export const GET = defineApiRoute({ }) } - return objekt.gebaeude_bilder + return objekt.bilder }, }) \ No newline at end of file diff --git a/src/pages/api/verbrauchsausweis-gewerbe/index.ts b/src/pages/api/verbrauchsausweis-gewerbe/index.ts index 3bac4930..8f93ce0a 100644 --- a/src/pages/api/verbrauchsausweis-gewerbe/index.ts +++ b/src/pages/api/verbrauchsausweis-gewerbe/index.ts @@ -109,7 +109,7 @@ export const GET = defineApiRoute({ include: { objekt: { include: { - gebaeude_bilder: true, + bilder: true, }, }, rechnungen: true, diff --git a/src/pages/api/verbrauchsausweis-wohnen/index.ts b/src/pages/api/verbrauchsausweis-wohnen/index.ts index 4d384540..679faab8 100644 --- a/src/pages/api/verbrauchsausweis-wohnen/index.ts +++ b/src/pages/api/verbrauchsausweis-wohnen/index.ts @@ -113,7 +113,7 @@ export const GET = defineApiRoute({ include: { objekt: { include: { - gebaeude_bilder: true, + bilder: true, }, }, rechnungen: true, diff --git a/src/pages/bilder/[uid].webp.ts b/src/pages/bilder/[uid].webp.ts index 63cdb2aa..abd0ea61 100644 --- a/src/pages/bilder/[uid].webp.ts +++ b/src/pages/bilder/[uid].webp.ts @@ -27,7 +27,7 @@ export const GET = defineApiRoute({ }) } - const image = await prisma.gebaeudeBilder.findUnique({ + const image = await prisma.bild.findUnique({ where: { uid } @@ -40,7 +40,7 @@ export const GET = defineApiRoute({ }) } - const path = fileURLToPath(new URL(`../../../../../persistent/images/${image.uid}.webp`, import.meta.url)) + const path = fileURLToPath(new URL(`../../../persistent/images/${image.uid}.webp`, import.meta.url)) const base64 = fs.readFileSync(path, "base64") const buffer = Buffer.from(base64, "base64"); diff --git a/src/pages/dashboard/ausweise-pruefen.astro b/src/pages/dashboard/ausweise-pruefen.astro index 839fe550..5acac832 100644 --- a/src/pages/dashboard/ausweise-pruefen.astro +++ b/src/pages/dashboard/ausweise-pruefen.astro @@ -35,7 +35,7 @@ const ausweise = await prisma.verbrauchsausweisWohnen.findMany({ include: { objekt: { include: { - gebaeude_bilder: true, + bilder: true, } }, events: true @@ -52,8 +52,8 @@ function omit(key: string, obj: Record) { const reformedAusweise = ausweise.map(ausweis => ({ ausweis: omit("aufnahme", ausweis) as VerbrauchsausweisWohnenClient, aufnahme: omit("objekt", omit("events", ausweis.aufnahme)) as AufnahmeClient, - objekt: omit("gebaeude_bilder", ausweis.aufnahme.objekt) as ObjektClient, - bilder: ausweis.aufnahme.objekt.gebaeude_bilder as unknown as UploadedGebaeudeBild[], + objekt: omit("bilder", ausweis.aufnahme.objekt) as ObjektClient, + bilder: ausweis.aufnahme.objekt.bilder as unknown as UploadedGebaeudeBild[], events: ausweis.aufnahme.events })) --- diff --git a/src/pages/dashboard/index.astro b/src/pages/dashboard/index.astro index cff83023..497e9fad 100644 --- a/src/pages/dashboard/index.astro +++ b/src/pages/dashboard/index.astro @@ -1,9 +1,10 @@ --- import { createCaller } from "../../astro-typesafe-api-caller.js"; -import UserLayout from "../../layouts/UserLayout.astro"; import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; import DashboardModule from "#modules/Dashboard/DashboardModule.svelte"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; +import Layout from "#layouts/Layout.astro"; +import { prisma } from "@ibcornelsen/database/server"; const accessTokenValid = await validateAccessTokenServer(Astro); @@ -18,13 +19,24 @@ const user = await caller.user.self.GET.fetch(undefined, { "Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` } }); -const gebaeudeArray = await caller.objekt.GET.fetch({ limit: 5 }, { - headers: { - "Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` + +if (!user) { + return Astro.redirect("/auth/login") +} + +const objekte = await prisma.objekt.findMany({ + where: { + benutzer: { + uid: user.uid + } + }, + take: 10, + include: { + bilder: true, } -}); +}) --- - - - \ No newline at end of file + + + \ No newline at end of file From 69566f1c7466f8b77d2234b452bc961e36c9004a Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Wed, 19 Feb 2025 18:12:48 +1100 Subject: [PATCH 2/3] Dashboard, Datenblatt usw. --- bun.lock | 15 +- package.json | 3 +- src/astro-typesafe-api-caller.ts | 10 +- src/components/AnsichtsausweisButton.svelte | 20 +- src/components/Ausweis/Progressbar.svelte | 2 +- src/components/Ausweis/types.ts | 19 +- src/components/Carousel.svelte | 174 +++++++ .../Dashboard/DashboardAusweis.svelte | 191 ++++---- .../Dashboard/DashboardObjekt.svelte | 27 ++ .../Dashboard/DashboardSidebar.svelte | 57 +-- src/components/DatenblattButton.svelte | 20 +- src/components/ThemeController.svelte | 9 +- .../sidebars/cards/NavigationCard.svelte | 6 +- ...UserLayout.astro => DashboardLayout.astro} | 4 +- src/lib/constants.ts | 4 +- src/lib/helpers.ts | 12 + src/lib/helpers/window.ts | 18 + src/lib/pdf/datenblatt.html | 87 ---- .../pdfDatenblattVerbrauchsausweisGewerbe.ts | 424 ++++++++++++++++++ src/lib/server/lexoffice.ts | 294 ++++++++++++ src/lib/server/objekt.ts | 52 +++ src/modules/Dashboard/DashboardModule.svelte | 31 +- .../Dashboard/DashboardObjektModule.svelte | 31 ++ src/modules/KundendatenModule.svelte | 19 +- ...chweisVerbrauchsausweisWohnenModule.svelte | 25 +- ... => bedarfsausweis-gewerbe-anfragen.astro} | 0 ...ro => geg-nachweis-gewerbe-anfragen.astro} | 0 ...tro => geg-nachweis-wohnen-anfragen.astro} | 2 +- .../index.ts | 1 + src/pages/bilder/[uid].webp.ts | 33 +- .../{ => admin}/ausweise-pruefen.astro | 14 +- src/pages/dashboard/admin/pdf-designer.astro | 2 +- src/pages/dashboard/admin/pdf-viewer.astro | 2 +- src/pages/dashboard/ausweise/index.astro | 2 +- src/pages/dashboard/einstellungen/index.astro | 2 +- src/pages/dashboard/index.astro | 14 +- src/pages/dashboard/objekt/[uid].astro | 54 +++ src/pages/pdf/datenblatt.astro | 92 ---- src/pages/pdf/datenblatt.ts | 127 ++++++ 39 files changed, 1479 insertions(+), 420 deletions(-) create mode 100644 src/components/Carousel.svelte create mode 100644 src/components/Dashboard/DashboardObjekt.svelte rename src/layouts/{UserLayout.astro => DashboardLayout.astro} (94%) create mode 100644 src/lib/helpers.ts create mode 100644 src/lib/helpers/window.ts delete mode 100644 src/lib/pdf/datenblatt.html create mode 100644 src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts create mode 100644 src/lib/server/lexoffice.ts create mode 100644 src/lib/server/objekt.ts create mode 100644 src/modules/Dashboard/DashboardObjektModule.svelte rename src/pages/angebot-anfragen/{bedarfsausweis-gewerbe-anfragen/index.astro => bedarfsausweis-gewerbe-anfragen.astro} (100%) rename src/pages/angebot-anfragen/{geg-nachweis-gewerbe-anfragen/index.astro => geg-nachweis-gewerbe-anfragen.astro} (100%) rename src/pages/angebot-anfragen/{geg-nachweis-wohnen-anfragen/index.astro => geg-nachweis-wohnen-anfragen.astro} (97%) rename src/pages/dashboard/{ => admin}/ausweise-pruefen.astro (78%) create mode 100644 src/pages/dashboard/objekt/[uid].astro delete mode 100644 src/pages/pdf/datenblatt.astro create mode 100644 src/pages/pdf/datenblatt.ts diff --git a/bun.lock b/bun.lock index 0daeee61..940d99d4 100644 --- a/bun.lock +++ b/bun.lock @@ -38,6 +38,7 @@ "postcss-nested": "^7.0.2", "radix-svelte-icons": "^1.0.0", "sass": "^1.83.4", + "siema": "^1.5.1", "svelte": "^3.59.2", "svelte-dialogs": "^1.2.2", "svelte-preprocess": "^5.1.4", @@ -59,6 +60,7 @@ "@types/jsonwebtoken": "^9.0.7", "@types/mime-types": "^2.1.4", "@types/nodemailer": "^6.4.17", + "@types/siema": "^1.4.11", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", @@ -67,7 +69,6 @@ "cypress": "^13.17.0", "cypress-file-upload": "^5.0.8", "cypress-vite": "^1.6.0", - "daisyui": "^4.12.23", "eslint": "~8.15.0", "eslint-config-prettier": "8.1.0", "postcss": "^8.5.1", @@ -566,6 +567,8 @@ "@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="], + "@types/siema": ["@types/siema@1.4.11", "", {}, "sha512-bPazsNVnMryrzZx2HiAeDXEpgaO98ToQk0cYJ/7yomLlVNHsn4IYPrLoQ50tQt11FGvkkNoepRyKcTNUhqjj+g=="], + "@types/sinonjs__fake-timers": ["@types/sinonjs__fake-timers@8.1.1", "", {}, "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g=="], "@types/sizzle": ["@types/sizzle@2.3.9", "", {}, "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w=="], @@ -848,8 +851,6 @@ "css-animation": ["css-animation@1.6.1", "", { "dependencies": { "babel-runtime": "6.x", "component-classes": "^1.2.5" } }, "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog=="], - "css-selector-tokenizer": ["css-selector-tokenizer@0.8.0", "", { "dependencies": { "cssesc": "^3.0.0", "fastparse": "^1.1.2" } }, "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg=="], - "css-styled": ["css-styled@1.0.8", "", { "dependencies": { "@daybrush/utils": "^1.13.0" } }, "sha512-tCpP7kLRI8dI95rCh3Syl7I+v7PP+2JYOzWkl0bUEoSbJM+u8ITbutjlQVf0NC2/g4ULROJPi16sfwDIO8/84g=="], "css-to-mat": ["css-to-mat@1.1.1", "", { "dependencies": { "@daybrush/utils": "^1.13.0", "@scena/matrix": "^1.0.0" } }, "sha512-kvpxFYZb27jRd2vium35G7q5XZ2WJ9rWjDUMNT36M3Hc41qCrLXFM5iEKMGXcrPsKfXEN+8l/riB4QzwwwiEyQ=="], @@ -860,8 +861,6 @@ "csvtojson": ["csvtojson@2.0.10", "", { "dependencies": { "bluebird": "^3.5.1", "lodash": "^4.17.3", "strip-bom": "^2.0.0" }, "bin": { "csvtojson": "./bin/csvtojson" } }, "sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ=="], - "culori": ["culori@3.3.0", "", {}, "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ=="], - "cypress": ["cypress@13.17.0", "", { "dependencies": { "@cypress/request": "^3.0.6", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "ci-info": "^4.0.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.3", "tree-kill": "1.2.2", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, "bin": { "cypress": "bin/cypress" } }, "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA=="], "cypress-file-upload": ["cypress-file-upload@5.0.8", "", { "peerDependencies": { "cypress": ">3.0.0" } }, "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g=="], @@ -870,8 +869,6 @@ "d3-dsv": ["d3-dsv@2.0.0", "", { "dependencies": { "commander": "2", "iconv-lite": "0.4", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json", "csv2tsv": "bin/dsv2dsv", "dsv2dsv": "bin/dsv2dsv", "dsv2json": "bin/dsv2json", "json2csv": "bin/json2dsv", "json2dsv": "bin/json2dsv", "json2tsv": "bin/json2dsv", "tsv2csv": "bin/dsv2dsv", "tsv2json": "bin/dsv2json" } }, "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w=="], - "daisyui": ["daisyui@4.12.23", "", { "dependencies": { "css-selector-tokenizer": "^0.8", "culori": "^3", "picocolors": "^1", "postcss-js": "^4" } }, "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ=="], - "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], @@ -1046,8 +1043,6 @@ "fast-xml-parser": ["fast-xml-parser@4.5.1", "", { "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w=="], - "fastparse": ["fastparse@1.1.2", "", {}, "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="], - "fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="], "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], @@ -1968,6 +1963,8 @@ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + "siema": ["siema@1.5.1", "", {}, "sha512-BUNFdTSbC9/2gA6r6teBY9B8O/XZOUz8kVyttpsbq4gbHF9PidUDzs6aPtiObhV4KoEuPQdhRvK5hPPi9lgSTg=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], diff --git a/package.json b/package.json index e8e4098b..97e73ccf 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "postcss-nested": "^7.0.2", "radix-svelte-icons": "^1.0.0", "sass": "^1.83.4", + "siema": "^1.5.1", "svelte": "^3.59.2", "svelte-dialogs": "^1.2.2", "svelte-preprocess": "^5.1.4", @@ -73,6 +74,7 @@ "@types/jsonwebtoken": "^9.0.7", "@types/mime-types": "^2.1.4", "@types/nodemailer": "^6.4.17", + "@types/siema": "^1.4.11", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", @@ -81,7 +83,6 @@ "cypress": "^13.17.0", "cypress-file-upload": "^5.0.8", "cypress-vite": "^1.6.0", - "daisyui": "^4.12.23", "eslint": "~8.15.0", "eslint-config-prettier": "8.1.0", "postcss": "^8.5.1", diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index a49d72c7..b42731cb 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -4,13 +4,13 @@ export const createCaller = createCallerFactory({ "klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"), "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"), - "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), + "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].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/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), - "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), - "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), + "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), + "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "geg-nachweis-verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/[uid].ts"), "geg-nachweis-verbrauchsausweis-wohnen": await import("../src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/index.ts"), @@ -19,8 +19,6 @@ export const createCaller = createCallerFactory({ "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-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), - "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), diff --git a/src/components/AnsichtsausweisButton.svelte b/src/components/AnsichtsausweisButton.svelte index bfa7b710..45a86271 100644 --- a/src/components/AnsichtsausweisButton.svelte +++ b/src/components/AnsichtsausweisButton.svelte @@ -2,31 +2,13 @@ import { Buffer } from "buffer"; import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js"; import { Enums } from "@ibcornelsen/database/client"; + import { openWindowWithPost } from "#lib/helpers/window.js"; export let ausweis: VerbrauchsausweisWohnenClient; export let objekt: ObjektClient; export let aufnahme: AufnahmeClient; export let bilder: UploadedGebaeudeBild[]; export let ausweisart: Enums.Ausweisart - - function openWindowWithPost(url: string, data: Record) { - var form = document.createElement("form"); - form.target = "_blank"; - form.method = "POST"; - form.action = url; - form.style.display = "none"; - - for (var key in data) { - var input = document.createElement("input"); - input.type = "hidden"; - input.name = key; - input.value = data[key]; - form.appendChild(input); - } - document.body.appendChild(form); - form.submit(); - document.body.removeChild(form); -} + + {/if} + {#if dots} +
    + {#each {length: totalDots} as _, i} +
  • go(i*currentPerPage)} class={isDotActive(currentIndex, i) ? "active" : ""}>
  • + {/each} +
+ {/if} + + + \ No newline at end of file diff --git a/src/components/Dashboard/DashboardAusweis.svelte b/src/components/Dashboard/DashboardAusweis.svelte index 75f6f376..f172364e 100644 --- a/src/components/Dashboard/DashboardAusweis.svelte +++ b/src/components/Dashboard/DashboardAusweis.svelte @@ -1,10 +1,5 @@ -
- {#if aufnahme.storniert} -
-

Storniert

+
+ {#if ausweis.storniert} +
+

+ Storniert +

{/if} -
+ +
+
- {#if aufnahme.ausweisart == "VerbrauchsausweisWohnen"} -
- Verbrauchsausweis Wohnen -
- {:else if aufnahme.ausweisart == "BedarfsausweisWohnen"} -
- Bedarfsausweis Wohnen -
- {:else if aufnahme.ausweisart == "VerbrauchsausweisGewerbe"} -
- Verbrauchsausweis Gewerbe -
+ {#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen} +
+ Verbrauchsausweis Wohnen +
+ {:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen} +
+ Bedarfsausweis Wohnen +
+ {:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe} +
+ Verbrauchsausweis Gewerbe +
{/if} - {#if aufnahme.erledigt} -
Ausgestellt
+ {#if ausweis.ausgestellt} +
Ausgestellt
{/if}

{objekt.adresse}

- + - {progress}% + {progress}%
- {#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt)} - - {:then calculations} -
-
- Energieverbrauch - {calculations?.endEnergieVerbrauchGesamt}kWh/A + {#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) then calculations} +
+
+ Energieverbrauch + {calculations?.endEnergieVerbrauchGesamt}kWh/A +
+
+ CO2 Ausstoß + {calculations?.co2EmissionenGesamt}Kg/A +
+
+ Erstellungsdatum + {moment(aufnahme.erstellungsdatum).format( + "DD.MM.YYYY" + )} +
+
+ Baujahr + {aufnahme.baujahr_gebaeude[0] || "N/A"} / + {aufnahme.baujahr_heizung[0] || "N/A"} +
+
+ Wohnfläche + {aufnahme.flaeche + ? `${aufnahme.flaeche}m²` + : "N/A"} +
+
+ ID + {ausweis.uid.split("-")[0]} +
-
- CO2 Ausstoß - {calculations?.co2EmissionenGesamt}Kg/A -
-
- Erstellungsdatum - {moment(aufnahme.erstellungsdatum).format( - "DD.MM.YYYY" - )} -
-
- Baujahr - {aufnahme.baujahr_gebaeude[0] || "N/A"} / - {aufnahme.baujahr_heizung[0] || - "N/A"} -
-
- Wohnfläche - {aufnahme.flaeche - ? `${aufnahme.flaeche}m²` - : "N/A"} -
-
- ID - {ausweis.uid.split("-")[0]} -
-
{/await} diff --git a/src/components/Dashboard/DashboardObjekt.svelte b/src/components/Dashboard/DashboardObjekt.svelte new file mode 100644 index 00000000..73640640 --- /dev/null +++ b/src/components/Dashboard/DashboardObjekt.svelte @@ -0,0 +1,27 @@ + + +
+ {#if objektBild} + Gebäude + {/if} + +
+
+

{objekt.adresse}

+ {moment(objekt.erstellungsdatum).format("DD.MM.YYYY")} +
+ +
+ +
+
+
\ No newline at end of file diff --git a/src/components/Dashboard/DashboardSidebar.svelte b/src/components/Dashboard/DashboardSidebar.svelte index 0dbde8c6..88a84742 100644 --- a/src/components/Dashboard/DashboardSidebar.svelte +++ b/src/components/Dashboard/DashboardSidebar.svelte @@ -1,7 +1,7 @@ -
+
-
@@ -119,7 +119,7 @@
@@ -129,7 +129,7 @@
@@ -138,34 +138,15 @@ />
-
+
{benutzer.vorname} {benutzer.name} - {benutzer.email} + {benutzer.email}
- -