Verbrauchsausweis Gewerbe
This commit is contained in:
@@ -4,7 +4,10 @@ import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
|
||||
import { Enums } from "@ibcornelsen/database/server";
|
||||
import * as fs from "fs"
|
||||
import moment from "moment";
|
||||
import { PDFDocument, PDFFont, PDFImage, PDFName, PDFNumber, PDFPage, rgb, StandardFonts, TextAlignment } from "pdf-lib";
|
||||
import { PDFDocument, PDFFont, PDFImage, PDFName, PDFNumber, PDFPage, rgb, 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";
|
||||
|
||||
|
||||
export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) {
|
||||
@@ -85,6 +88,30 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
size: 10
|
||||
})
|
||||
|
||||
const erneuerbareEnergienVerwendung = []
|
||||
|
||||
if (ausweis.alternative_heizung) {
|
||||
erneuerbareEnergienVerwendung.push("Heizung")
|
||||
}
|
||||
|
||||
if (ausweis.alternative_kuehlung) {
|
||||
erneuerbareEnergienVerwendung.push("Kühlung")
|
||||
}
|
||||
|
||||
if (ausweis.alternative_lueftung) {
|
||||
erneuerbareEnergienVerwendung.push("Lüftung")
|
||||
}
|
||||
|
||||
if (ausweis.alternative_warmwasser) {
|
||||
erneuerbareEnergienVerwendung.push("Warmwasser")
|
||||
}
|
||||
|
||||
pages[0].drawText(erneuerbareEnergienVerwendung.join(", "), {
|
||||
x: 358,
|
||||
y: height - 325,
|
||||
size: 8
|
||||
})
|
||||
|
||||
if (ausweis.warmwasser_enthalten) {
|
||||
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, {
|
||||
x: 211,
|
||||
@@ -93,25 +120,38 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
})
|
||||
}
|
||||
|
||||
function checkbox(page: PDFPage, x: number, y: number) {
|
||||
page.drawSvgPath(`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>`, {
|
||||
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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user