diff --git a/src/components/AusweisPruefenBox.svelte b/src/components/AusweisPruefenBox.svelte index 80d18900..2c0b988b 100644 --- a/src/components/AusweisPruefenBox.svelte +++ b/src/components/AusweisPruefenBox.svelte @@ -479,11 +479,11 @@ - {#if aufnahme.erledigt} + {#if ausweis.ausgestellt}
- {:else if aufnahme.bestellt} + {:else if ausweis.bestellt}
diff --git a/src/lib/pdf/images/stempel-unterschrift.png b/src/lib/pdf/images/stempel-unterschrift.png new file mode 100644 index 00000000..d0a5407d Binary files /dev/null and b/src/lib/pdf/images/stempel-unterschrift.png differ diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index 1de9435d..679d949d 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -4,7 +4,7 @@ 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, StandardFonts, TextAlignment } from "pdf-lib"; +import { PDFDocument, PDFFont, PDFImage, PDFName, PDFNumber, PDFPage, rgb, StandardFonts, TextAlignment } from "pdf-lib"; export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) { @@ -44,80 +44,75 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe } pages[0].drawText(aufnahme.gebaeudetyp || "", { - x: 181, - y: height - 191, + x: 211, + y: height - 166, size: 10 }) pages[0].drawText(objekt.adresse || "", { - x: 181, - y: height - 210, + x: 211, + y: height - 194, size: 10 }) pages[0].drawText(aufnahme.gebaeudeteil || "", { - x: 181, - y: height - 226, + x: 211, + y: height - 214.5, size: 10 }) pages[0].drawText(aufnahme.baujahr_gebaeude?.toString() || "", { - x: 181, - y: height - 242.5, + x: 211, + y: height - 229.5, size: 10 }) pages[0].drawText(aufnahme.baujahr_heizung?.toString() || "", { - x: 181, - y: height - 259, + x: 211, + y: height - 250, size: 10 }) pages[0].drawText(aufnahme.nutzflaeche?.toString() || "", { - x: 181, - y: height - 295, + x: 211, + y: height - 271.5, size: 10 }) pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, { - x: 181, - y: height - 314, + x: 211, + y: height - 285, size: 10 }) + if (ausweis.warmwasser_enthalten) { + pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, { + x: 211, + y: height - 299, + size: 10 + }) + } + + function checkbox(page: PDFPage, x: number, y: number) { + page.drawSvgPath(``, { + x, + y, + scale: 0.4, + color: rgb(0,0,0) + }) + } + + if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) { + checkbox(pages[0], 213, height - 334) + } else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) { + checkbox(pages[0], 213, height - 345) + } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) { + checkbox(pages[0], 355, height - 334) + } else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) { + checkbox(pages[0], 355, height - 345) + } - // const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "") - - // const adresse = fillFormField("adresse", objekt.adresse) - - - // const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "") - - // const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude?.toString()) - - // const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString()) - - // const einheiten = fillFormField("einheiten", aufnahme.einheiten?.toString()) - - // const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`) - - // fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`) - - // if (ausweis.warmwasser_enthalten) { - // fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`) - // } - - // toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung) - // toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung) - // toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) - // toggleCheck("lueftungsanlage_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) - - // toggleCheck("anlass_neubau", ausweis.ausstellgrund == "Neubau") - // toggleCheck("anlass_vermietung", ausweis.ausstellgrund == "Vermietung" || ausweis.ausstellgrund == "Verkauf") - // toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung") - // toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges") - const gebaeudeBild = bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude); @@ -129,10 +124,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe image = await pdf.embedPng(gebaeudeBild?.base64) } pages[0].drawImage(image, { - x: 424.5, - y: height - 321, + x: 460.5, + y: height - 289, width: 111, - height: 143 + height: 138 }) } @@ -368,7 +363,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe const addEmpfehlungenGenerator = () => { let i = 0; let yOffset = 43; - const initialHeight = 568 + const initialHeight = 562 const initialXOffset = 36; return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => { pages[3].drawText((i + 1).toString(), { diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index 2e8afcfb..6c1985c9 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -5,6 +5,8 @@ import { Enums } from "@ibcornelsen/database/server"; import * as fs from "fs" 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"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -45,7 +47,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "") - const adresse = fillFormField("adresse", objekt.adresse) + const adresse = fillFormField("adresse", objekt.adresse || "") const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "") @@ -54,7 +56,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString()) - const einheiten = fillFormField("einheiten", aufnahme.einheiten?.toString()) + const einheiten = fillFormField("einheiten", (aufnahme.einheiten || 1).toString()) const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`) @@ -91,6 +93,48 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne }) } + if (aufnahme.flaeche == 0) { + addCheckMark(pages[0], 274, height - 277) + } + + // Checkmark Angabe energetische Qualität des Gebäudes. + addCheckMark(pages[0], 43, height - 560) + + // Datenerhebung durch Eigentümer + addCheckMark(pages[0], 298, height - 590) + + // Ausstellungsdatum + pages[0].drawText(moment().format("DD.MM.YYYY"), { + font, + size: 10, + x: 508, + y: height - 771 + }) + + // 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 + + // 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 + + pages[0].drawImage(stempel, { + x: 450, + y: height - 770, + height: stempelHeight, + width: stempel.width / (stempel.height / stempelHeight) + }) + } + + /* -------------------------------- Seite 2 -------------------------------- */ @@ -110,9 +154,25 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne const pfeilWidth = 20 const margin = 5; + // Buchstaben hinzufügen und hervorheben + const klassen: [string, number][] = [ + ["A+", 94], + ["A", 136.5], + ["B", 175], + ["C", 215], + ["D", 264], + ["E", 320], + ["F", 382], + ["G", 447], + ["H", 495], + ] + for (const klasse of klassen) { + addText(page, klasse[0], klasse[1], height - 227, 12, berechnungen?.energieEffizienzKlasse === klasse[0] ? bold : font) + } + page.drawImage(pfeilNachUnten, { x: endenergieverbrauchTranslationX, - y: height - 215, + y: height - 212, width: pfeilWidth, height: 30 }) @@ -149,7 +209,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne page.drawImage(pfeilNachOben, { x: primaerenergieverbrauchTranslationX, - y: height - 298, + y: height - 297, width: pfeilWidth, height: 30 }) @@ -184,6 +244,22 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne addEnergieverbrauchSkalaPfeile(pages[2]) + // CO2 Emissionen + pages[2].drawText(berechnungen?.co2EmissionenGesamt.toString() || "", { + x: 392, + y: height - 166.5, + font, + size: 10 + }) + + // Endenergieverbrauch + pages[2].drawText(berechnungen?.endEnergieVerbrauchGesamt.toString() || "", { + x: 455, + y: height - 326, + font, + size: 10 + }) + /* -------------------------------- Seite 3 -------------------------------- */ // Verbräuche @@ -260,11 +336,11 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne addVerbrauch( moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), - aufnahme.brennstoff_1, + aufnahme.brennstoff_1 || "", berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), - Math.round(berechnungen?.energieVerbrauchGesamt_1).toString(), + Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), "0", - Math.round(berechnungen?.energieVerbrauchHeizung_1).toString(), + Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(), berechnungen?.durchschnittsKlimafaktor.toString() ); } else { @@ -272,11 +348,11 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne addVerbrauch( moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), - aufnahme.brennstoff_1, + aufnahme.brennstoff_1 || "", berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), - Math.round(berechnungen?.energieVerbrauchGesamt_1).toString(), - Math.round(berechnungen?.energieVerbrauchWarmwasser_1).toString(), - Math.round(berechnungen?.energieVerbrauchHeizung_1).toString(), + Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), + Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(), + Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(), berechnungen?.durchschnittsKlimafaktor.toString() ); } @@ -285,11 +361,11 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne addVerbrauch( moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), - aufnahme.brennstoff_2, + aufnahme.brennstoff_2 || "", berechnungen?.brennstoff_2.primaerenergiefaktor.toString(), - Math.round(berechnungen?.energieVerbrauchGesamt_2).toString(), - Math.round(berechnungen?.energieVerbrauchWarmwasser_2).toString(), - Math.round(berechnungen?.energieVerbrauchHeizung_2).toString(), + Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(), + Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(), + Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(), berechnungen?.durchschnittsKlimafaktor.toString() ); } @@ -304,8 +380,8 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), "Warmwasserzuschlag", berechnungen?.primaerfaktorww.toString(), - Math.round(berechnungen?.energieVerbrauchWarmwasser_1).toString(), - Math.round(berechnungen?.energieVerbrauchWarmwasser_1).toString(), + Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(), + Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(), "0", "0" ); @@ -322,9 +398,9 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), "Leerstandszuschlag", berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), - Math.round(berechnungen?.leerstandsZuschlagHeizung + berechnungen?.leerstandsZuschlagWarmwasser).toString(), - Math.round(berechnungen?.leerstandsZuschlagWarmwasser).toString(), - Math.round(berechnungen?.leerstandsZuschlagHeizung).toString(), + Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(), + Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(), + Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(), berechnungen?.durchschnittsKlimafaktor.toString() ); } else { @@ -333,7 +409,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), "Leerstandszuschlag", berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), - Math.round(berechnungen?.leerstandsZuschlagHeizung + berechnungen?.leerstandsZuschlagWarmwasser).toString(), + Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(), "0", "0", berechnungen?.durchschnittsKlimafaktor.toString() @@ -352,7 +428,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), "Leerstandszuschlag", berechnungen?.primaerfaktorww.toString(), - Math.round(berechnungen?.kuehlungsZuschlag).toString(), + Math.round(berechnungen?.kuehlungsZuschlag || 0).toString(), "0", "0", "1.8" @@ -447,11 +523,21 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne }) } + 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) + addDatumGEG(page, font) } - // pdf.getForm().flatten() + pdf.getForm().flatten() return pdf.save(); } \ No newline at end of file diff --git a/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf b/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf index 5aee3f6c..6d700892 100644 Binary files a/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf and b/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf differ diff --git a/src/lib/pdf/utils/checkbox.ts b/src/lib/pdf/utils/checkbox.ts new file mode 100644 index 00000000..d2cf7270 --- /dev/null +++ b/src/lib/pdf/utils/checkbox.ts @@ -0,0 +1,13 @@ +import { PDFPage, rgb } from "pdf-lib"; + +export function addCheckMark(page: PDFPage, x: number, y: number) { + page.drawSvgPath( + ``, + { + x, + y, + scale: 0.4, + color: rgb(0, 0, 0), + } + ); +} diff --git a/src/lib/pdf/utils/text.ts b/src/lib/pdf/utils/text.ts new file mode 100644 index 00000000..1a175e2e --- /dev/null +++ b/src/lib/pdf/utils/text.ts @@ -0,0 +1,7 @@ +import { PDFField, PDFFont, PDFPage } from "pdf-lib"; + +export function addText(page: PDFPage, text: string, x: number, y: number, size: number, font: PDFFont) { + page.drawText(text, { + font, x, y, size + }) +} \ No newline at end of file diff --git a/src/pages/api/rechnung/index.ts b/src/pages/api/rechnung/index.ts index 32da79b1..28e76488 100644 --- a/src/pages/api/rechnung/index.ts +++ b/src/pages/api/rechnung/index.ts @@ -113,6 +113,41 @@ export const PUT = defineApiRoute({ }); } + if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { + await prisma.bedarfsausweisWohnen.update({ + where: { + uid: ausweis_uid + }, + data: { + bestellt: true + } + }) + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + await prisma.verbrauchsausweisGewerbe.update({ + where: { + uid: ausweis_uid + }, + data: { + bestellt: true + } + }) + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + // Wir müssen überprüfen, ob dem Nutzer der Ausweis tatsächlich gehört. + await prisma.verbrauchsausweisWohnen.update({ + where: { + uid: ausweis_uid + }, + data: { + bestellt: true + } + }); + } else { + throw new APIError({ + code: "BAD_REQUEST", + message: "Ausweisart nicht unterstützt.", + }); + } + if (bezahlmethode === Enums.Bezahlmethoden.rechnung) { return { uid: rechnung.uid } }