Merge pull request #512 from IBCornelsen/main

get main
This commit is contained in:
Jens Cornelsen
2025-04-18 12:27:28 +02:00
committed by GitHub
19 changed files with 760 additions and 227 deletions

2
.gitignore vendored
View File

@@ -34,7 +34,7 @@ dbml/schema.dbml
prisma/migrations/20250315143314_/migration.sql prisma/migrations/20250315143314_/migration.sql
src/astro-typesafe-api-caller.ts # src/astro-typesafe-api-caller.ts
src/testing/ausweise.csv src/testing/ausweise.csv
src/testing/users.csv src/testing/users.csv

View File

@@ -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"),
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.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"),
})

View File

@@ -124,7 +124,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
client:load client:load
/> />
<article class="box px-6 py-5 h-screen"> <article class="box px-6 py-5 h-full">
<slot /> <slot />
</article> </article>
</main> </main>

View File

@@ -85,13 +85,13 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
let energieVerbrauchWarmwasser_1 = 0; let energieVerbrauchWarmwasser_1 = 0;
let energieVerbrauchWarmwasser_2 = 0; let energieVerbrauchWarmwasser_2 = 0;
if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0) { if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0 && ausweis.anteil_warmwasser_1 !== null) {
// Wenn Warmwasser enthalten und Anteil bekannt // Wenn Warmwasser enthalten und Anteil bekannt
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100); energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100);
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
} else if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 == 0){ } else if (ausweis.warmwasser_enthalten && (ausweis.anteil_warmwasser_1 == 0 || ausweis.anteil_warmwasser_1 === null)) {
if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") { if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") {
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5; energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5;
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
@@ -107,8 +107,14 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
energieVerbrauchWarmwasser_2 = 0; energieVerbrauchWarmwasser_2 = 0;
} }
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; let kuehlungsZuschlag = 0;
if (aufnahme.kuehlung) { if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null) {
kuehlungsZuschlag = 6 * nutzflaeche * 3;
}
if (ausweis.kuehlung_enthalten && ausweis.kuehlung_enthalten !== null)
{
kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100); kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100);
kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100); kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100);
} }
@@ -168,7 +174,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.coe; let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.coe;
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.coe; let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.coe;
let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag; let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag + (kuehlungsZuschlag / (3 * nutzflaeche));
let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom; let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom;
let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom; let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom;
@@ -180,6 +186,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
brennstoff_2, brennstoff_2,
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1), kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2), kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
kuehlungsZuschlag: Math.round(kuehlungsZuschlag),
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor * 100) / 100, durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor * 100) / 100,
Klimafaktor_1 : klimafaktoren[0], Klimafaktor_1 : klimafaktoren[0],
Klimafaktor_2 : klimafaktoren[1], Klimafaktor_2 : klimafaktoren[1],

View File

@@ -116,7 +116,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
energieVerbrauchHeizung_2 * durchschnittsKlimafaktor; energieVerbrauchHeizung_2 * durchschnittsKlimafaktor;
let kuehlungsZuschlag = 0; let kuehlungsZuschlag = 0;
if (aufnahme.kuehlung) { if (aufnahme.kuehlung === "1") {
kuehlungsZuschlag = 6 * 3 * energetischeNutzflaeche; kuehlungsZuschlag = 6 * 3 * energetischeNutzflaeche;
} }

View File

@@ -35,6 +35,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
const marginY = 150; const marginY = 150;
benutzer = benutzer || { benutzer = benutzer || {
firma: "Max Mustermann GmbH",
vorname: "Max", vorname: "Max",
name: "Mustermann", name: "Mustermann",
adresse: "Musterstraße 123", adresse: "Musterstraße 123",
@@ -53,7 +54,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
const id = ausweis.id; const id = ausweis.id;
const layout = xml2pdf(`<layout height="${pages[0].getHeight()}" width="${pages[0].getWidth()}" marginTop="150" marginLeft="${marginX}" marginRight="${marginX}"> const layout = xml2pdf(`<layout height="${pages[0].getHeight()}" width="${pages[0].getWidth()}" marginTop="150" marginLeft="${marginX}" marginRight="${marginX}">
<text size="12" lineHeight="14">${benutzer.vorname} ${benutzer.name}</text> <text size="12" lineHeight="14">${benutzer.firma}</text>
<text size="12" lineHeight="14">${benutzer.adresse}</text> <text size="12" lineHeight="14">${benutzer.adresse}</text>
<text size="12" lineHeight="14">${benutzer.plz} ${benutzer.ort}</text> <text size="12" lineHeight="14">${benutzer.plz} ${benutzer.ort}</text>
<flex direction="row" justify="space-between" marginTop="55" width="${innerWidth}"> <flex direction="row" justify="space-between" marginTop="55" width="${innerWidth}">

View File

@@ -4,7 +4,6 @@ import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs" import * as fs from "fs"
import moment from "moment"; import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib"; import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addCheckMark } from "./utils/checkbox.js";
import { addText } from "./utils/text.js"; import { addText } from "./utils/text.js";
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js"; import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
import { getS3File } from "#lib/s3.js"; import { getS3File } from "#lib/s3.js";
@@ -103,7 +102,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
}) })
if (ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, { pages[3].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
y: height - 299, y: height - 299,
size: 10 size: 10
@@ -112,30 +111,73 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) { if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
addCheckMark(pages[0], 213, height - 334) pages[0].drawText("x", {
x: 214,
y: height - 342,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) { } else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
addCheckMark(pages[0], 213, height - 345) pages[0].drawText("x", {
x: 214,
y: height - 353,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) { } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
addCheckMark(pages[0], 355, height - 334) pages[0].drawText("x", {
x: 356,
y: height - 342,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) { } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
addCheckMark(pages[0], 355, height - 345) pages[0].drawText("x", {
x: 356,
y: height - 353,
size: 10,
font: bold
})
} }
// Kühlung // Kühlung
if (aufnahme.kuehlung) { if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null) {
addCheckMark(pages[0], 213, height - 362.5) pages[0].drawText("x", {
} else { x: 356,
addCheckMark(pages[0], 355, height - 373.5) y: height - 370.5,
size: 10,
font: bold
})
} }
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) { if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
addCheckMark(pages[0], 213, height - 406) pages[0].drawText("x", {
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung) { x: 214,
addCheckMark(pages[0], 213, height - 417) y: height - 414,
size: 10,
font: bold
})
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung || ausweis.ausstellgrund === Enums.Ausstellgrund.Verkauf) {
pages[0].drawText("x", {
x: 214,
y: height - 425,
size: 10,
font: bold
})
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) { } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
addCheckMark(pages[0], 344.5, height - 406) pages[0].drawText("x", {
x: 345.5,
y: height - 414,
size: 10,
font: bold
})
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) { } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
addCheckMark(pages[0], 463, height - 417) pages[0].drawText("x", {
x: 464,
y: height - 425,
size: 10,
font: bold
})
} }
// Aushangpflicht // Aushangpflicht
// addCheckMark(pages[0], 463, height - 406) // addCheckMark(pages[0], 463, height - 406)
@@ -161,11 +203,21 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
} }
} }
// Checkmark Angabe energetische Qualität des Gebäudes. // Checkmark Verbrauchsausweis.
addCheckMark(pages[0], 40, height - 550) pages[0].drawText("x", {
x: 41,
y: height - 558,
size: 10,
font: bold
})
// Datenerhebung durch Eigentümer // Datenerhebung durch Eigentümer
addCheckMark(pages[0], 295, height - 580) pages[0].drawText("x", {
x: 296.5,
y: height - 587.5,
size: 10,
font: bold
})
// Ausstellungsdatum // Ausstellungsdatum
pages[0].drawText(moment().format("DD.MM.YYYY"), { pages[0].drawText(moment().format("DD.MM.YYYY"), {
@@ -186,7 +238,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
// Stempel und Unterschrift // Stempel und Unterschrift
if (ausweis.ausgestellt || !vorschau) { if (ausweis.ausgestellt || !vorschau) {
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64")); const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
const stempelHeight = 60 const stempelHeight = 65
pages[0].drawImage(stempel, { pages[0].drawImage(stempel, {
x: 450, x: 450,
@@ -200,10 +252,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
// Aussteller // Aussteller
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64")); const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
pages[0].drawImage(aussteller, { pages[0].drawImage(aussteller, {
x: 40, x: 260,
y: height - 750, y: height - 755,
width: 100, width: 130,
height: 50 height: 65
}) })
@@ -216,10 +268,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")) 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 // 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 endenergieverbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
const stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000 const stromVerbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
const vergleichsWertWaermeTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / 1000 const vergleichsWertWaermeTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
const vergleichsWertStromTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / 1000 const vergleichsWertStromTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
const minTranslation = 78 const minTranslation = 78
const maxTranslation = 512 const maxTranslation = 512
@@ -244,15 +296,64 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
width: pfeilWidth, width: pfeilWidth,
height: 30 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) { if (endenergieverbrauchTranslationPercentage > 0.5) {
page.drawText("Endenergieverbrauch Wärme", { page.drawText("Endenergieverbrauch Wärme", {
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10), x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Wärme", 10),
y: height - 191, y: height - 191,
size: 10 size: 10
}) })
@@ -279,7 +380,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
if (vergleichsWertWaermeTranslationPercentage > 0.5) { if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Wärme", { page.drawText("Vergleichswert Wärme", {
x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10), x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Wärme", 10),
y: height - 275, y: height - 275,
size: 10 size: 10
}) })
@@ -318,9 +419,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
height: 30 height: 30
}) })
if (endenergieverbrauchTranslationPercentage > 0.5) { if (stromVerbrauchTranslationPercentage > 0.5) {
page.drawText("Endenergieverbrauch Strom", { page.drawText("Endenergieverbrauch Strom", {
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10), x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Strom", 10),
y: height - 335, y: height - 335,
size: 10 size: 10
}) })
@@ -347,7 +448,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
if (vergleichsWertWaermeTranslationPercentage > 0.5) { if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Strom", { page.drawText("Vergleichswert Strom", {
x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10), x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Strom", 10),
y: height - 420, y: height - 420,
size: 10 size: 10
}) })
@@ -376,35 +477,75 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
addEnergieverbrauchSkalaPfeile(pages[2]) addEnergieverbrauchSkalaPfeile(pages[2])
if (ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
addCheckMark(pages[2], 41, height - 293) pages[2].drawText("x", {
x: 42,
y: height - 301,
size: 10,
font: bold
})
} }
if (ausweis.kuehlung_enthalten) { if (ausweis.kuehlung_enthalten) {
addCheckMark(pages[2], 41, height - 305) pages[2].drawText("x", {
x: 42,
y: height - 313,
size: 10,
font: bold
})
} }
if (ausweis.stromverbrauch_enthaelt_heizung) { if (ausweis.stromverbrauch_enthaelt_heizung) {
addCheckMark(pages[2], 41, height - 456) pages[2].drawText("x", {
x: 42,
y: height - 464,
size: 10,
font: bold
})
} }
if (ausweis.stromverbrauch_enthaelt_warmwasser) { if (ausweis.stromverbrauch_enthaelt_warmwasser) {
addCheckMark(pages[2], 131, height - 456) pages[2].drawText("x", {
x: 132,
y: height - 464,
size: 10,
font: bold
})
} }
if (ausweis.stromverbrauch_enthaelt_lueftung) { if (ausweis.stromverbrauch_enthaelt_lueftung) {
addCheckMark(pages[2], 218, height - 456) pages[2].drawText("x", {
x: 219,
y: height - 464,
size: 10,
font: bold
})
} }
if (ausweis.stromverbrauch_enthaelt_beleuchtung) { if (ausweis.stromverbrauch_enthaelt_beleuchtung) {
addCheckMark(pages[2], 281, height - 456) pages[2].drawText("x", {
x: 282,
y: height - 464,
size: 10,
font: bold
})
} }
if (ausweis.stromverbrauch_enthaelt_kuehlung) { if (ausweis.stromverbrauch_enthaelt_kuehlung) {
addCheckMark(pages[2], 422, height - 456) pages[2].drawText("x", {
x: 423,
y: height - 464,
size: 10,
font: bold
})
} }
if (ausweis.stromverbrauch_enthaelt_sonstige) { if (ausweis.stromverbrauch_enthaelt_sonstige) {
addCheckMark(pages[2], 492, height - 456) pages[2].drawText("x", {
x: 493,
y: height - 464,
size: 10,
font: bold
})
} }
addText(pages[2], berechnungen?.primaerEnergieVerbrauchGesamt.toString() || "", 475, height - 637, 10, font) addText(pages[2], berechnungen?.primaerEnergieVerbrauchGesamt.toString() || "", 475, height - 637, 10, font)
@@ -498,7 +639,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
const addVerbrauch = addVerbrauchGenerator(); const addVerbrauch = addVerbrauchGenerator();
if (!ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
// Mit Warmwasserzuschlag // Mit Warmwasserzuschlag
addVerbrauch( addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).format("MM.YYYY"),
@@ -506,7 +647,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
ausweis.brennstoff_1 || "", ausweis.brennstoff_1 || "",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
"0", Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1, berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1,
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
berechnungen?.durchschnittsKlimafaktor.toString(), berechnungen?.durchschnittsKlimafaktor.toString(),
@@ -545,7 +686,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
// TODO // TODO
if (!ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
/** /**
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m² * Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2 * @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
@@ -592,7 +733,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
} }
} }
if (aufnahme.kuehlung) { if (aufnahme.kuehlung === "1") {
/** /**
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m² * Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
* Primärenergiefaktor Strom * Primärenergiefaktor Strom
@@ -605,9 +746,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
"", "",
// TODO // TODO
// berechnungen?.primaerfaktorww.toString(), // berechnungen?.primaerfaktorww.toString(),
Math.round(berechnungen?.kuehlungsZuschlag_1 || 0).toString(), "",
"0", "",
0, Math.round(berechnungen?.kuehlungsZuschlag || 0),
"" ""
); );
} }

View File

@@ -4,7 +4,6 @@ import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs" import * as fs from "fs"
import moment from "moment"; import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib"; import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addCheckMark } from "./utils/checkbox.js";
import { addText } from "./utils/text.js"; import { addText } from "./utils/text.js";
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js"; import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
import { getS3File } from "#lib/s3.js"; import { getS3File } from "#lib/s3.js";
@@ -12,6 +11,7 @@ import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnun
/* -------------------------------- Pdf Tools ------------------------------- */ /* -------------------------------- Pdf Tools ------------------------------- */
export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) { 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 VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Wohngebaeude_ohne_pfeile.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
@@ -28,6 +28,18 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
const font = await pdf.embedFont(StandardFonts.Helvetica) const font = await pdf.embedFont(StandardFonts.Helvetica)
const bold = await pdf.embedFont(StandardFonts.HelveticaBold) const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
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 || "")
}
}
pages[0].drawText(`ID: ${ausweis.id || ""}`, { pages[0].drawText(`ID: ${ausweis.id || ""}`, {
x: 211, x: 211,
y: height - 112.5, y: height - 112.5,
@@ -40,9 +52,34 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 10 size: 10
}) })
const bild = bilder && bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
if (bild) {
const file = await getS3File("ibc-images", `${bild.id}.jpg`);
if (file) {
let image: PDFImage;
image = await pdf.embedJpg(file)
pages[0].drawImage(image, {
x: 460.5,
y: height - 289,
width: 111,
height: 138
})
}
}
pages[0].drawText(objekt.adresse || "", { pages[0].drawText(objekt.adresse || "", {
x: 211, x: 211,
y: height - 194, y: height - 188.5,
size: 10
})
const plzOrt = `${objekt.plz || ""} ${objekt.ort || ""}`
pages[0].drawText(plzOrt || "", {
x: 211,
y: height - 200,
size: 10 size: 10
}) })
@@ -70,18 +107,36 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 10 size: 10
}) })
pages[0].drawText(aufnahme.nutzflaeche?.toString() || "", { pages[0].drawText(Math.round(berechnungen?.energetischeNutzflaeche || 0).toString() || "", {
x: 211, x: 211,
y: height - 285, y: height - 285,
size: 10 size: 10
}) })
// Nach 82 aus Wohnfläche ermittelt
if (aufnahme.nutzflaeche == 0) {
pages[0].drawText("x", {
x: 275,
y: height - 285,
size: 10,
font: bold
})
}
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, { pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
y: height - 298.5, y: height - 298.5,
size: 10 size: 10
}) })
if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211,
y: height - 299,
size: 10
})
}
if (ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, { pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
@@ -91,6 +146,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
} }
const erneuerbareEnergienVerwendung = [] const erneuerbareEnergienVerwendung = []
if (ausweis.alternative_heizung) { if (ausweis.alternative_heizung) {
@@ -115,69 +171,91 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 8 size: 8
}) })
if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211,
y: height - 299,
size: 10
})
}
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) { if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
addCheckMark(pages[0], 213, height - 347) pages[0].drawText("x", {
x: 214,
y: height - 355,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) { } else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
addCheckMark(pages[0], 213, height - 358) pages[0].drawText("x", {
x: 214,
y: height - 366,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) { } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
addCheckMark(pages[0], 355, height - 347) pages[0].drawText("x", {
x: 356,
y: height - 355,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) { } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
addCheckMark(pages[0], 355, height - 358) pages[0].drawText("x", {
x: 356,
y: height - 366,
size: 10,
font: bold
})
} }
// Kühlung // Kühlung
if (aufnahme.kuehlung) { if (aufnahme.kuehlung === "1") {
addCheckMark(pages[0], 213, height - 375.5) pages[0].drawText("x", {
} else { x: 213,
addCheckMark(pages[0], 355, height - 386.5) y: height - 383.5,
size: 10,
font: bold
})
} }
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) { if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
addCheckMark(pages[0], 213, height - 419) pages[0].drawText("x", {
x: 214,
y: height - 427,
size: 10,
font: bold
})
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung || ausweis.ausstellgrund === Enums.Ausstellgrund.Verkauf) { } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung || ausweis.ausstellgrund === Enums.Ausstellgrund.Verkauf) {
addCheckMark(pages[0], 213, height - 430) pages[0].drawText("x", {
x: 214,
y: height - 438,
size: 10,
font: bold
})
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) { } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
addCheckMark(pages[0], 344.5, height - 419) pages[0].drawText("x", {
x: 345.5,
y: height - 427,
size: 10,
font: bold
})
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) { } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
addCheckMark(pages[0], 463, height - 419) pages[0].drawText("x", {
} x: 464,
y: height - 427,
const bild = bilder && bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude); size: 10,
font: bold
if (bild) {
const file = await getS3File("ibc-images", `${bild.id}.jpg`);
if (file) {
let image: PDFImage;
image = await pdf.embedJpg(file)
pages[0].drawImage(image, {
x: 460.5,
y: height - 289,
width: 111,
height: 138
}) })
} }
}
// Nach 82 aus Wohnfläche ermittelt // Checkmark Angabe Verbrauchsausweis
if (aufnahme.flaeche == 0) { pages[0].drawText("x", {
addCheckMark(pages[0], 274, height - 277) x: 44,
} y: height - 568,
size: 10,
// Checkmark Angabe energetische Qualität des Gebäudes. font: bold
addCheckMark(pages[0], 43, height - 560) })
// Datenerhebung durch Eigentümer // Datenerhebung durch Eigentümer
addCheckMark(pages[0], 298, height - 590) pages[0].drawText("x", {
x: 299,
y: height - 598,
size: 10,
font: bold
})
// Ausstellungsdatum // Ausstellungsdatum
pages[0].drawText(moment().format("DD.MM.YYYY"), { pages[0].drawText(moment().format("DD.MM.YYYY"), {
@@ -198,7 +276,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
// Stempel und Unterschrift // Stempel und Unterschrift
if (!vorschau) { if (!vorschau) {
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64")); const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
const stempelHeight = 60 const stempelHeight = 65
pages[0].drawImage(stempel, { pages[0].drawImage(stempel, {
x: 450, x: 450,
@@ -212,10 +290,10 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64")); const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
pages[0].drawImage(aussteller, { pages[0].drawImage(aussteller, {
x: 40, x: 260,
y: height - 770, y: height - 775,
width: 100, width: 130,
height: 50 height: 65
}) })
@@ -326,7 +404,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
} }
} }
addEnergieverbrauchSkalaPfeile(pages[2])
// CO2 Emissionen // CO2 Emissionen
pages[2].drawText(berechnungen?.co2EmissionenGesamt.toString() || "", { pages[2].drawText(berechnungen?.co2EmissionenGesamt.toString() || "", {
@@ -336,6 +414,8 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 10 size: 10
}) })
addEnergieverbrauchSkalaPfeile(pages[2])
// Endenergieverbrauch // Endenergieverbrauch
pages[2].drawText(berechnungen?.endEnergieVerbrauchGesamt.toString() || "", { pages[2].drawText(berechnungen?.endEnergieVerbrauchGesamt.toString() || "", {
x: 455, x: 455,
@@ -501,7 +581,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
} }
} }
if (aufnahme.kuehlung) { if (aufnahme.kuehlung === "1") {
/** /**
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m² * Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
* Primärenergiefaktor Strom * Primärenergiefaktor Strom
@@ -593,16 +673,5 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten) addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
} }
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(); return pdf.save();
} }

View File

@@ -122,7 +122,7 @@ export async function createInvoice(
}, },
title: "Rechnung", title: "Rechnung",
introduction: 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.", remark: "Vielen Dank für Ihren Einkauf.",
}; };

View File

@@ -1016,7 +1016,8 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen} {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
<!-- Verbrauchsausweis Wohnen [altes System: $ausweis->anteil_warmwasser_1 < 6 OR $ausweis->anteil_warmwasser_1 > 40] --> <!-- Verbrauchsausweis Wohnen [altes System: $ausweis->anteil_warmwasser_1 < 6 OR $ausweis->anteil_warmwasser_1 > 40] -->
{#if (ausweis.anteil_warmwasser_1 < 6) || (ausweis.anteil_warmwasser_1 > 40)} {#if (ausweis.anteil_warmwasser_1 !== null)}
{#if ((ausweis.anteil_warmwasser_1 < 6) && (ausweis.anteil_warmwasser_1 != 0)) || (ausweis.anteil_warmwasser_1 > 40)}
<div class="pruefpunkt"> <div class="pruefpunkt">
<input type="checkbox" name="pruefpunkt_anteil_warmwasser" bind:checked={ausweis.pruefpunkt_anteil_warmwasser} required/> <input type="checkbox" name="pruefpunkt_anteil_warmwasser" bind:checked={ausweis.pruefpunkt_anteil_warmwasser} required/>
<div class="text-left"> <div class="text-left">
@@ -1025,6 +1026,7 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
</div> </div>
{/if} {/if}
{/if} {/if}
{/if}
{#if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen} {#if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
<!-- Zusätzlich beim Bedarfsausweis [altes System: $ausweis->wohnflaeche < $ausweis->energetische_nutzfläche] --> <!-- Zusätzlich beim Bedarfsausweis [altes System: $ausweis->wohnflaeche < $ausweis->energetische_nutzfläche] -->
{#if ausweis.flaeche < ausweis.nutzflaeche} {#if ausweis.flaeche < ausweis.nutzflaeche}

View File

@@ -67,9 +67,11 @@ export const GET = defineApiRoute({
const rechnung = await prisma.rechnung.findFirst({ const rechnung = await prisma.rechnung.findFirst({
where: { where: {
verbrauchsausweis_wohnen: { OR: [
id: id_ausweis, { bedarfsausweis_wohnen: { id: id_ausweis } },
}, { verbrauchsausweis_wohnen: { id: id_ausweis } },
{ verbrauchsausweis_gewerbe: { id: id_ausweis } }
]
}, },
orderBy: { orderBy: {
erstellt_am: "desc", erstellt_am: "desc",
@@ -220,18 +222,6 @@ fax 040 · 209339859
</table> </table>
<br> <br>
<p>
Alternativ können Sie auch direkt online zahlen indem Sie auf den entsprechenden Link klicken:
</p>
<br>
<table>
<tr><td>Per Einzuglastschrift zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=SEPA'>jetzt per ELV bezahlen</a></td></tr>
<tr><td>Per Sofortüberweisung zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Sofort'>jetzt per Sofortüberweisung bezahlen</a></td></tr>
<tr><td>Über PayPal zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=PayPal'>jetzt per Paypal bezahlen</a></td></tr>
<tr><td>Per Giropay zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Giropay'>jetzt per Giropay bezahlen</a></td></tr>
<tr><td>Per Visa oder MasterCard zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Kreditkarte'>jetzt per Kreditkarte bezahlen</a></td></tr>
</table>
<br> <br>
<p> <p>
@@ -264,7 +254,7 @@ fax 040 · 209339859
subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`, subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`,
html, html,
attachments: [{ attachments: [{
filename: `ID_${ausweis.id}_Ansichtsausweis.pdf`, filename: `ID_${ausweis.id}_Energieausweis.pdf`,
encoding: "binary", encoding: "binary",
content: Buffer.from(pdfAusweis), content: Buffer.from(pdfAusweis),
contentType: "application/pdf", contentType: "application/pdf",

View File

@@ -23,13 +23,16 @@ const totalPages = await prisma.objekt.count({
} : {} } : {}
}) })
const objekte = await prisma.objekt.findMany({ let objekte = []
if (id) {
objekte = await prisma.objekt.findMany({
where: user.rolle === Enums.BenutzerRolle.USER ? { where: user.rolle === Enums.BenutzerRolle.USER ? {
benutzer: { benutzer: {
id: user.id id: user.id
}, },
} : { } : {
...(id ? {OR: [ ...(id ? {
OR: [
{ {
aufnahmen: { aufnahmen: {
every: { every: {
@@ -86,7 +89,72 @@ const objekte = await prisma.objekt.findMany({
}, },
take: 25, take: 25,
skip: (page - 1) * 25 skip: (page - 1) * 25
}) })
} else {
objekte = await prisma.objekt.findMany({
where: user.rolle === Enums.BenutzerRolle.USER ? {
benutzer: {
id: user.id
},
} : {
OR: [
{
aufnahmen: {
every: {
verbrauchsausweise_gewerbe: {
some: {
ausgestellt: false,
bestellt: true
}
},
}
}
},
{
aufnahmen: {
every: {
verbrauchsausweise_wohnen: {
some: {
ausgestellt: false,
bestellt: true
}
},
}
}
},
{
aufnahmen: {
every: {
bedarfsausweise_wohnen: {
some: {
ausgestellt: false,
bestellt: true
}
},
}
}
}]
},
orderBy: {
erstellungsdatum: "desc"
},
include: {
aufnahmen: {
include: {
bilder: true,
unterlagen: true,
bedarfsausweise_wohnen: true,
verbrauchsausweise_gewerbe: true,
verbrauchsausweise_wohnen: true
}
}
},
take: 25,
skip: (page - 1) * 25
})
}
--- ---
<UserLayout title="Objekte" {user}> <UserLayout title="Objekte" {user}>

View File

@@ -0,0 +1,37 @@
import { Enums, prisma } from "#lib/server/prisma.js";
let start = 1;
let limit = 10;
const existing_bedarfsausweiswohnen_list = await prisma.bedarfsausweisWohnen.findMany({
where: {
rechnung_id: null
}
});
for (const ausweis of existing_bedarfsausweiswohnen_list) {
if (ausweis.bestellt == true && ausweis.benutzer_id != "USCTJ2VV"){
console.log(
'ID:' + ausweis.id +
' Reg.Nr:' + ausweis.registriernummer +
' Rechnung_id: ' + ausweis.rechnung_id +
' Bestellt: ' + ausweis.bestellt +
' Ausgestellt: ' + ausweis.ausgestellt +
' Ausgestellt am: ' + ausweis.ausstellungsdatum
);
await prisma.bedarfsausweisWohnen.update({
where: {
id: ausweis.id
},
data: {
bestellt: false,
ausgestellt: false,
ausstellungsdatum: null
}
});
// if (start >= limit) break;
start++;
}
}

View File

@@ -0,0 +1,52 @@
import { Enums, prisma } from "#lib/server/prisma.js";
import Papa from "papaparse"
import * as fs from "fs";
import { fileURLToPath } from "url";
import { generatePrefixedId } from "#lib/db.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
const path = fileURLToPath(new URL("./rechnungen.csv", import.meta.url));
if (!fs.existsSync(path)) {
throw new Error(`${path} existiert nicht.`)
}
const file = fs.createReadStream(path, "utf8");
Papa.parse(file, {
header: true,
async complete(results, file) {
let i = 0;
for (const rechnung of results.data as any) {
i++
if (i % 1000 === 0) {
console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`)
}
const existing_rechnung = await prisma.rechnung.findFirst({
where: {
alte_id: parseInt(rechnung.id)
}
})
if (existing_rechnung) {
const existing_bedarfsausweiswohnen = await prisma.bedarfsausweisWohnen.findFirst({
where: {
alte_ausweis_id: parseInt(rechnung.ausweis_id)
}
})
if (existing_bedarfsausweiswohnen){
if (existing_bedarfsausweiswohnen.rechnung_id != existing_rechnung.id){
console.log('Rechnungsnummer weicht ab. Alte Ausweis Id:'+ rechnung.ausweis_id + ': ' + existing_bedarfsausweiswohnen.rechnung_id + ' vs ' + existing_rechnung.id);
//Todo: Rechnungsid updaten
} else {
//console.log('Rechnungsnummer Abgleich ok. Alte Ausweis Id:'+ rechnung.ausweis_id + ': ' + existing_bedarfsausweiswohnen.rechnung_id + ' vs ' + existing_rechnung.id);
}
}
} else {
console.log('Rechnung existiert nicht: '+ parseInt(rechnung.id));
}
//if (i > 10000) break;
}
}
});

View File

@@ -0,0 +1,37 @@
import { Enums, prisma } from "#lib/server/prisma.js";
let start = 1;
let limit = 10;
const existing_verbauchsauweisgewerbe_list = await prisma.verbrauchsausweisGewerbe.findMany({
where: {
rechnung_id: null
}
});
for (const ausweis of existing_verbauchsauweisgewerbe_list) {
if (ausweis.bestellt == true && ausweis.benutzer_id != "USCTJ2VV"){
console.log(
'ID:' + ausweis.id +
' Reg.Nr:' + ausweis.registriernummer +
' Rechnung_id: ' + ausweis.rechnung_id +
' Bestellt: ' + ausweis.bestellt +
' Ausgestellt: ' + ausweis.ausgestellt +
' Ausgestellt am: ' + ausweis.ausstellungsdatum
);
await prisma.verbrauchsausweisGewerbe.update({
where: {
id: ausweis.id
},
data: {
bestellt: false,
ausgestellt: false,
ausstellungsdatum: null
}
});
// if (start >= limit) break;
start++;
}
}

View File

@@ -0,0 +1,37 @@
import { Enums, prisma } from "#lib/server/prisma.js";
let start = 1;
let limit = 10;
const existing_verbauchsausweiswohnen_list = await prisma.verbrauchsausweisWohnen.findMany({
where: {
rechnung_id: null
}
});
for (const ausweis of existing_verbauchsausweiswohnen_list) {
if (ausweis.bestellt == true && ausweis.benutzer_id != "USCTJ2VV"){
console.log(
'ID:' + ausweis.id +
' Reg.Nr:' + ausweis.registriernummer +
' Rechnung_id: ' + ausweis.rechnung_id +
' Bestellt: ' + ausweis.bestellt +
' Ausgestellt: ' + ausweis.ausgestellt +
' Ausgestellt am: ' + ausweis.ausstellungsdatum
);
await prisma.verbrauchsausweisWohnen.update({
where: {
id: ausweis.id
},
data: {
bestellt: false,
ausgestellt: false,
ausstellungsdatum: null
}
});
// if (start >= limit) break;
start++;
}
}

View File

@@ -0,0 +1,46 @@
import { Enums, prisma } from "#lib/server/prisma.js";
import Papa from "papaparse"
import * as fs from "fs";
import { fileURLToPath } from "url";
import { generatePrefixedId } from "#lib/db.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
const path = fileURLToPath(new URL("./users.csv", import.meta.url));
if (!fs.existsSync(path)) {
throw new Error(`${path} existiert nicht.`)
}
const file = fs.createReadStream(path, "utf8");
Papa.parse(file, {
header: true,
async complete(results, file) {
let i = 0;
for (const user of results.data as any) {
i++
if (i % 100 === 0) {
//console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`)
}
const existing = await prisma.benutzer.findFirst({
where: {
email: user.email
}
})
if (existing) {
if (existing.alte_id == null){
console.log('User: ' + user.email + ' fehlt alte id ('+user.id+')');
await prisma.benutzer.update({
where: {
email: user.email
},
data: {
alte_id: parseInt(user.id)
}
});
}
}
}
}
});

View File

@@ -19,7 +19,7 @@ Papa.parse(file, {
let i = 0; let i = 0;
for (const rechnung of results.data as any) { for (const rechnung of results.data as any) {
i++ i++
if (i % 50 === 0) { if (i % 500 === 0) {
console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`) console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`)
} }
const existing = await prisma.rechnung.findFirst({ const existing = await prisma.rechnung.findFirst({
@@ -29,7 +29,7 @@ Papa.parse(file, {
}) })
if (existing) { if (existing) {
console.log(`Rechnung für ${rechnung.id} existiert bereits.`); //console.log(`Rechnung für ${rechnung.id} existiert bereits.`);
continue; continue;
} }
@@ -166,6 +166,7 @@ Papa.parse(file, {
await prisma.rechnung.create({ await prisma.rechnung.create({
data data
}); });
console.log('User: ' + rechnung.user_id + ' Rechnung:' + rechnung.id);
} catch (e) { } catch (e) {
console.log(e); console.log(e);
continue; continue;