diff --git a/.gitignore b/.gitignore index 632a0be9..2f42277a 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,7 @@ dbml/schema.dbml prisma/migrations/20250315143314_/migration.sql -src/astro-typesafe-api-caller.ts +# src/astro-typesafe-api-caller.ts src/testing/ausweise.csv src/testing/users.csv diff --git a/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf b/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf index 476ccc13..8d10fb4b 100644 Binary files a/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf and b/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf differ diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts new file mode 100644 index 00000000..38dbbbd9 --- /dev/null +++ b/src/astro-typesafe-api-caller.ts @@ -0,0 +1,45 @@ +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"), + "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), + "ausweise": await import("../src/pages/api/ausweise/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"), + "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 diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts index dde2ebb5..65eafb1f 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts @@ -108,7 +108,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: } let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; - if (aufnahme.kuehlung) { + if (aufnahme.kuehlung === "1") { kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100); kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100); } diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts index 60ed6296..7118c5cb 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts @@ -116,7 +116,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016( energieVerbrauchHeizung_2 * durchschnittsKlimafaktor; let kuehlungsZuschlag = 0; - if (aufnahme.kuehlung) { + if (aufnahme.kuehlung === "1") { kuehlungsZuschlag = 6 * 3 * energetischeNutzflaeche; } diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index 83632657..264f5c37 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -216,10 +216,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe 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 stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000 - const vergleichsWertWaermeTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / 1000 - const vergleichsWertStromTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / 1000 + const endenergieverbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / (berechnungen?.vergleichsWertWaerme * 2) + const stromVerbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2) + const vergleichsWertWaermeTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / (berechnungen?.vergleichsWertWaerme * 2) + const vergleichsWertStromTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2) const minTranslation = 78 const maxTranslation = 512 @@ -244,15 +244,64 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe width: pfeilWidth, height: 30 }) + const endEnergieVerbrauchGesamt = Math.round(berechnungen?.endEnergieVerbrauchGesamt ?? 0); + const MaxvergleichsWertWaerme = Math.round(berechnungen?.vergleichsWertWaerme * 2); + const MaxvergleichsWertWaermeText = `> ${MaxvergleichsWertWaerme.toString()}`; + const MaxvergleichswertStrom = Math.round(berechnungen?.vergleichsWertStrom * 2); + const MaxvergleichswertStromText = `> ${Math.round(MaxvergleichswertStrom).toString()}`; + const endEnergieVerbrauchGesamtText = `${endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; + const stromVerbrauchGesamtText = `${Math.round(berechnungen?.endEnergieVerbrauchStrom ?? 0).toString()}kWh/(m²a)`; + const vergleichswertWaermeText = `${Math.round(berechnungen?.vergleichsWertWaerme).toString()}kWh/(m²a)` + const vergleichswertWaermeText2 = `${Math.round(berechnungen?.vergleichsWertWaerme).toString()}` + const vergleichswertStromText = `${Math.round(berechnungen?.vergleichsWertStrom).toString()}kWh/(m²a)` + const vergleichswertStromText2 = `${Math.round(berechnungen?.vergleichsWertStrom).toString()}` + + page.drawText("0", { + x: 85, + y: height - 241, + size: 13, + font: bold + }) + + page.drawText(vergleichswertWaermeText2, { + x: 295, + y: height - 241, + size: 13, + font: bold + }) + + page.drawText(MaxvergleichsWertWaermeText, { + x: vergleichsWertWaermeTranslationX * 2 - 78, + y: height - 241, + size: 13, + font: bold + }) + + page.drawText("0", { + x: 85, + y: height - 385, + size: 13, + font: bold + }) + + page.drawText(vergleichswertStromText2, { + x: 295, + y: height - 385, + size: 13, + font: bold + }) + + page.drawText(MaxvergleichswertStromText, { + x: vergleichsWertStromTranslationX * 2 - 78, + y: height - 385, + size: 13, + font: bold + }) - const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; - const stromVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchStrom.toString()}kWh/(m²a)`; - const vergleichswertWaermeText = `${berechnungen?.vergleichsWertWaerme.toString()}kWh/(m²a)` - const vergleichswertStromText = `${berechnungen?.vergleichsWertStrom.toString()}kWh/(m²a)` if (endenergieverbrauchTranslationPercentage > 0.5) { page.drawText("Endenergieverbrauch Wärme", { - x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10), + x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Wärme", 10), y: height - 191, size: 10 }) @@ -279,7 +328,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe if (vergleichsWertWaermeTranslationPercentage > 0.5) { page.drawText("Vergleichswert Wärme", { - x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10), + x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Wärme", 10), y: height - 275, size: 10 }) @@ -318,9 +367,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe height: 30 }) - if (endenergieverbrauchTranslationPercentage > 0.5) { + if (stromVerbrauchTranslationPercentage > 0.5) { page.drawText("Endenergieverbrauch Strom", { - x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10), + x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Strom", 10), y: height - 335, size: 10 }) @@ -347,7 +396,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe if (vergleichsWertWaermeTranslationPercentage > 0.5) { page.drawText("Vergleichswert Strom", { - x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10), + x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Strom", 10), y: height - 420, size: 10 }) diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index a5f3c72f..132f1cc1 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -135,7 +135,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne } // Kühlung - if (aufnahme.kuehlung) { + if (aufnahme.kuehlung === "1") { addCheckMark(pages[0], 213, height - 375.5) } else { addCheckMark(pages[0], 355, height - 386.5) @@ -501,7 +501,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne } } - if (aufnahme.kuehlung) { + if (aufnahme.kuehlung === "1") { /** * Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m² * Primärenergiefaktor Strom diff --git a/src/lib/server/invoice.ts b/src/lib/server/invoice.ts index ae5cc794..ae659d6b 100644 --- a/src/lib/server/invoice.ts +++ b/src/lib/server/invoice.ts @@ -122,7 +122,7 @@ export async function createInvoice( }, title: "Rechnung", introduction: - "Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung", + `Ihren Energieausweis (Ausweis ID ${ausweis.id}) stellen wir Ihnen hiermit in Rechnung`, remark: "Vielen Dank für Ihren Einkauf.", }; diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index 07f5861b..4dcfe4ab 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -264,7 +264,7 @@ fax 040 · 209339859 subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`, html, attachments: [{ - filename: `ID_${ausweis.id}_Ansichtsausweis.pdf`, + filename: `ID_${ausweis.id}_Energieausweis.pdf`, encoding: "binary", content: Buffer.from(pdfAusweis), contentType: "application/pdf", diff --git a/src/testing/ausweise-fix-rechnungsid.ts b/src/testing/ausweise-fix-rechnungsid.ts new file mode 100644 index 00000000..ffe7544a --- /dev/null +++ b/src/testing/ausweise-fix-rechnungsid.ts @@ -0,0 +1,39 @@ +import moment from "moment"; +import { Enums, prisma } from "#lib/server/prisma.js"; +import * as fs from "fs"; +import { fileURLToPath } from "url"; +import { hashPassword } from "#lib/password.js"; +import Papa from "papaparse"; +import { generatePrefixedId } from "#lib/db.js"; +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; +import { tryCatch } from "#lib/tryCatch.js"; +import { createBrotliDecompress } from "zlib"; + +const path = fileURLToPath(new URL("./ausweise.csv.br", import.meta.url)); // .br for Brotli file + +if (!fs.existsSync(path)) { + throw new Error(`${path} existiert nicht.`); +} + +let i = 0; +const brotliStream = fs.createReadStream(path).pipe(createBrotliDecompress()); + +Papa.parse(brotliStream, { + header: true, + async complete(results, file) { + for (const dataset of results.data as any) { + const existing = await prisma.verbrauchsausweisWohnen.findFirst({ + where: { + alte_ausweis_id: parseInt(dataset.id) + } + }); + + if (existing) { + continue; + } + + console.log(dataset.id); + // do something with dataset... + } + }, +}); \ No newline at end of file