From 7add66ab78adea8e69178d6bbba99b37febe3332 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Wed, 5 Feb 2025 11:18:42 +0700 Subject: [PATCH 01/11] Verbrauchsausweis Gewerbe --- src/astro-typesafe-api-caller.ts | 4 +- .../Ausweis/AusweisPreviewContainer.svelte | 8 +- .../Ausweis/ButtonWeiterHilfe.svelte | 4 +- src/components/Ausweis/DaemmungImage.svelte | 10 +- src/components/Ausweis/FensterImage.svelte | 10 +- src/components/Ausweis/HeizungImage.svelte | 8 +- .../Ausweis/PerformanceScore.svelte | 2 +- .../SanierungszustandFensterTueren.svelte | 144 ++++++++++++------ .../SanierungszustandHeizungsanlage.svelte | 7 +- .../SanierungszustandWaermedammung.svelte | 114 +++++++++----- src/components/Ausweis/StromVerbrauch.svelte | 22 +-- src/components/ImageGrid.svelte | 10 +- src/components/UploadImages.svelte | 10 +- .../audits/VerbrauchAbweichung.ts | 4 +- .../VerbrauchsausweisGewerbe/erstellen.cy.ts | 19 ++- .../VerbrauchsausweisGewerbeModule.svelte | 73 ++++----- .../AusweisWeiter.svelte | 4 +- .../VerbrauchsausweisWohnenModule.svelte | 8 +- .../api/verbrauchsausweis-gewerbe/index.ts | 6 +- .../verbrauchsausweis-gewerbe/index.astro | 82 ++++++++-- 20 files changed, 339 insertions(+), 210 deletions(-) diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index c12f37e9..72c5bd87 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -5,13 +5,13 @@ export const createCaller = createCallerFactory({ "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), + "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), - "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), - "objekt": await import("../src/pages/api/objekt/index.ts"), "rechnung": await import("../src/pages/api/rechnung/index.ts"), + "objekt": await import("../src/pages/api/objekt/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"), diff --git a/src/components/Ausweis/AusweisPreviewContainer.svelte b/src/components/Ausweis/AusweisPreviewContainer.svelte index 95326009..b4d9dbd4 100644 --- a/src/components/Ausweis/AusweisPreviewContainer.svelte +++ b/src/components/Ausweis/AusweisPreviewContainer.svelte @@ -9,13 +9,15 @@ } from "@ibcornelsen/database/client"; import { + BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, + VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "./types.js"; - export let ausweis: VerbrauchsausweisWohnenClient; - export let gebaeude: ObjektClient; + export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; + export let objekt: ObjektClient; export let images: UploadedGebaeudeBild[] = []; @@ -29,7 +31,7 @@ kategorie={Enums.BilderKategorie.Gebaeude} max={1} min={1} - bind:gebaeude + bind:objekt bind:images bind:ausweis > diff --git a/src/components/Ausweis/ButtonWeiterHilfe.svelte b/src/components/Ausweis/ButtonWeiterHilfe.svelte index d1172743..fcc14a64 100644 --- a/src/components/Ausweis/ButtonWeiterHilfe.svelte +++ b/src/components/Ausweis/ButtonWeiterHilfe.svelte @@ -3,13 +3,15 @@ import Hilfe from "#components/Ausweis/Hilfe.svelte"; import { AufnahmeClient, + BedarfsausweisWohnenClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, + VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "./types.js"; - export let ausweis: VerbrauchsausweisWohnenClient; + export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let bilder: UploadedGebaeudeBild[]; export let user: BenutzerClient; export let objekt: ObjektClient; diff --git a/src/components/Ausweis/DaemmungImage.svelte b/src/components/Ausweis/DaemmungImage.svelte index b8d9319f..c648edd0 100644 --- a/src/components/Ausweis/DaemmungImage.svelte +++ b/src/components/Ausweis/DaemmungImage.svelte @@ -1,11 +1,11 @@
@@ -66,7 +66,7 @@ kategorie={Enums.BilderKategorie.Daemmung} bind:images bind:ausweis - bind:gebaeude + bind:objekt > TEXT FEHLT diff --git a/src/components/Ausweis/FensterImage.svelte b/src/components/Ausweis/FensterImage.svelte index 70ae2845..f22cfa99 100644 --- a/src/components/Ausweis/FensterImage.svelte +++ b/src/components/Ausweis/FensterImage.svelte @@ -1,11 +1,11 @@
@@ -62,7 +62,7 @@ kategorie={Enums.BilderKategorie.Fenster} bind:images bind:ausweis - bind:gebaeude + bind:objekt > TEXT FEHLT diff --git a/src/components/Ausweis/HeizungImage.svelte b/src/components/Ausweis/HeizungImage.svelte index a6d15b20..e2e48075 100644 --- a/src/components/Ausweis/HeizungImage.svelte +++ b/src/components/Ausweis/HeizungImage.svelte @@ -1,10 +1,10 @@ @@ -57,7 +57,7 @@ kategorie={Enums.BilderKategorie.Heizung} max={4} min={1} - bind:gebaeude + bind:objekt={gebaeude} bind:images bind:ausweis > diff --git a/src/components/Ausweis/PerformanceScore.svelte b/src/components/Ausweis/PerformanceScore.svelte index b4d4812c..d49a756d 100644 --- a/src/components/Ausweis/PerformanceScore.svelte +++ b/src/components/Ausweis/PerformanceScore.svelte @@ -10,7 +10,7 @@ } from "./types.js"; import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; - export let ausweis: VerbrauchsausweisWohnenClient; + export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let aufnahme: AufnahmeClient; export let objekt: ObjektClient; diff --git a/src/components/Ausweis/SanierungszustandFensterTueren.svelte b/src/components/Ausweis/SanierungszustandFensterTueren.svelte index 960f9798..f2b7e534 100644 --- a/src/components/Ausweis/SanierungszustandFensterTueren.svelte +++ b/src/components/Ausweis/SanierungszustandFensterTueren.svelte @@ -1,28 +1,30 @@ - -
+ +
- - - - - - - - - - - -
- - - - - + " +> + + + + + + + + + +
+ + + - - \ No newline at end of file + + diff --git a/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte b/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte index 3c5616d6..9726eef8 100644 --- a/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte +++ b/src/components/Ausweis/SanierungszustandHeizungsanlage.svelte @@ -10,14 +10,15 @@ AufnahmeClient, ObjektClient, UploadedGebaeudeBild, + VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "./types.js"; import { boolean } from "astro:schema"; import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte"; - export let gebaeude: ObjektClient; + export let objekt: ObjektClient; export let aufnahme: AufnahmeClient; - export let ausweis: VerbrauchsausweisWohnenClient; + export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient; export let images: UploadedGebaeudeBild[]; @@ -119,7 +120,7 @@ >
- + - - \ No newline at end of file + + diff --git a/src/components/Ausweis/StromVerbrauch.svelte b/src/components/Ausweis/StromVerbrauch.svelte index 1b479496..e5b266a5 100644 --- a/src/components/Ausweis/StromVerbrauch.svelte +++ b/src/components/Ausweis/StromVerbrauch.svelte @@ -16,13 +16,13 @@ import { AufnahmeClient, ObjektClient, - VerbrauchsausweisWohnenClient, + VerbrauchsausweisGewerbeClient, } from "./types.js"; import { addNotification } from "#components/Notifications/shared.js"; - export let gebaeude: ObjektClient; + export let objekt: ObjektClient; export let aufnahme: AufnahmeClient; - export let ausweis: VerbrauchsausweisWohnenClient; + export let ausweis: VerbrauchsausweisGewerbeClient; // Wir dürfen bis zu 4.5 Jahre alte Klimafaktoren benutzen, also nehmen wir alle Monate seitdem und generieren daraus die Auswahl. // Allerdings müssen wir auch berücksichtigen, dass wir drei folgende Jahre brauchen, also @@ -48,12 +48,12 @@ ]; const startDate = moment( - ausweis.aufnahme.erstellungsdatum || Date.now() + aufnahme.erstellungsdatum || Date.now() ) .subtract(4, "years") .subtract(6, "months"); const endDate = moment( - ausweis.aufnahme.erstellungsdatum || Date.now() + aufnahme.erstellungsdatum || Date.now() ).subtract(3, "years"); for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) { @@ -102,7 +102,7 @@ } } - $: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude); + $: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
- - - - - + + + + +
diff --git a/src/components/ImageGrid.svelte b/src/components/ImageGrid.svelte index 40853055..5300e911 100644 --- a/src/components/ImageGrid.svelte +++ b/src/components/ImageGrid.svelte @@ -1,15 +1,15 @@
- +
{#each images as image, i} {#if image.kategorie == kategorie} diff --git a/src/components/UploadImages.svelte b/src/components/UploadImages.svelte index f7e34b33..a14c6af3 100644 --- a/src/components/UploadImages.svelte +++ b/src/components/UploadImages.svelte @@ -1,17 +1,17 @@ @@ -38,6 +40,7 @@ bind:user bind:objekt bind:aufnahme + {ausweisart} >
diff --git a/src/components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte b/src/components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte deleted file mode 100644 index 4271e054..00000000 --- a/src/components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - -
- - -
- - - - -
diff --git a/src/components/Ausweis/Rechnungsadresse.svelte b/src/components/Ausweis/Rechnungsadresse.svelte index 0ff1c4fa..8ffa6a69 100644 --- a/src/components/Ausweis/Rechnungsadresse.svelte +++ b/src/components/Ausweis/Rechnungsadresse.svelte @@ -6,19 +6,7 @@ import { BenutzerClient, RechnungClient } from "./types.js"; export let user: BenutzerClient; - - let rechnung: RechnungClient = { - email: user.email, - empfaenger: user.vorname + " " + user.name, - strasse: user.adresse, - plz: user.plz, - ort: user.ort, - versand_empfaenger: user.vorname + " " + user.name, - versand_strasse: user.adresse, - versand_plz: user.plz, - versand_ort: user.ort, - telefon: user.telefon, - }; + export let rechnung: Partial; diff --git a/src/components/Ausweis/Verbrauch.svelte b/src/components/Ausweis/Verbrauch.svelte index 0ba316a8..a81c7837 100644 --- a/src/components/Ausweis/Verbrauch.svelte +++ b/src/components/Ausweis/Verbrauch.svelte @@ -3,9 +3,6 @@ import Inputlabel from "#components/labels/InputLabel.svelte"; import Verbrauchslabel from "#components/labels/VerbrauchsLabel.svelte"; import VerbrauchsHelpLabel from "#components/labels/VerbrauchsHelpLabel.svelte"; - - import Label from "../Label.svelte"; - import moment from "moment"; import fuelList from "./brennstoffListe.js"; import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung.js"; @@ -16,7 +13,7 @@ } from "./types.js"; import { addNotification } from "#components/Notifications/shared.js"; - export let gebaeude: ObjektClient; + export let objekt: ObjektClient; export let aufnahme: AufnahmeClient; export let ausweis: VerbrauchsausweisWohnenClient; @@ -43,14 +40,13 @@ "Dezember", ]; - const startDate = moment( - aufnahme.erstellungsdatum || Date.now() - ) + const startDate = moment(aufnahme.erstellungsdatum || Date.now()) .subtract(4, "years") .subtract(6, "months"); - const endDate = moment( - aufnahme.erstellungsdatum || Date.now() - ).subtract(3, "years"); + const endDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract( + 3, + "years" + ); for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) { availableDates.push({ @@ -84,21 +80,28 @@ $: { console.log(month, year); - - if ((availableDates.filter(date => date.month === month && date.year === year).length === 0) && typeof month === "number" && typeof year === "number") { + + if ( + availableDates.filter( + (date) => date.month === month && date.year === year + ).length === 0 && + typeof month === "number" && + typeof year === "number" + ) { addNotification({ message: "Monat nicht verfügbar.", - subtext: "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.", + subtext: + "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.", dismissable: true, type: "warning", timeout: 0, uid: "monat_nicht_verfuegbar", - selector: "select[name='energieverbrauch_zeitraum_monat']" - }) + selector: "select[name='energieverbrauch_zeitraum_monat']", + }); } } - $: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude); + $: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
- Sie haben die Möglichkeit neben der Hauptheizung die Verbräuche weiterer Heizquellen - (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben. - Dazu setzen Sie den Haken bei zusätzlicher Heizquelle. Eine weiterer Bereich zur Eingabe der - Verbräuche öffnet sich dann. + Sie haben die Möglichkeit neben der Hauptheizung die Verbräuche weiterer Heizquellen + (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel + etc.) einzugeben. Dazu setzen Sie den Haken bei zusätzlicher Heizquelle. + Eine weiterer Bereich zur Eingabe der Verbräuche öffnet sich dann.
@@ -189,10 +196,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie hier den Startmonat der ersten Verbrauchsperiode ein. Es sind nur Monate auswählbar, - die im zulässigen Zeitraum (Endzeitpunkt von Jahr 3 darf nicht älter als 18 Monate sein) liegen. Wählen Sie ein - aktuellerses Jahr um alle Monate zu sehen. - + Bitte geben Sie hier den Startmonat der ersten Verbrauchsperiode ein. Es sind nur Monate auswählbar, die im zulässigen Zeitraum + (Endzeitpunkt von Jahr 3 darf nicht älter als 18 Monate sein) + liegen. Wählen Sie ein aktuellerses Jahr um alle Monate zu sehen. +
@@ -218,8 +228,12 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie das Startjahr der ersten Verbrauchsperiode ein. Weitere Zeitangaben müssen nichht - gemacht werden, da alle 3 Verbrauchsjahre zusammenhängend sein sollen. + Bitte geben Sie das Startjahr der ersten Verbrauchsperiode ein. Weitere Zeitangaben müssen nichht gemacht werden, da alle + 3 Verbrauchsjahre zusammenhängend sein sollen.
@@ -244,16 +258,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Heizöl: Flüssiger fossiler Brennstoff.
- Erdgas: Gasförmiger fossiler Brennstoff.
- Flüssiggas: Wie Erdgas fossiler Brennstoff - im Flüssiggastank gelagert
- Braunkohle: Fester fossiler Brennstoff
- Holz-Pellets: Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff
- Holzhackschnitzel:Wie Holz-Pellets
- Fernwärme, Nahwärme: kommunales Wärmenetz - erfragen Sie - den Primärenergiefaktor bei Ihrem Energieversorger (meistens mit regenartivem Anteil)
- Strommix: Meist bei Wärmepumpe oder Nachtspeicher.
- Koks: stark kohlenstoffhaltiger fossiler Brennstoff.
+ Heizöl: Flüssiger fossiler Brennstoff.
+ Erdgas: Gasförmiger fossiler Brennstoff.
+ Flüssiggas: Wie Erdgas fossiler Brennstoff - im + Flüssiggastank gelagert
+ Braunkohle: Fester fossiler Brennstoff
+ Holz-Pellets: Stäbchenförmige Pellets - erneuerbarer + (nachwachsender) Brennstoff
+ Holzhackschnitzel:Wie Holz-Pellets
+ Fernwärme, Nahwärme: kommunales Wärmenetz - + erfragen Sie den Primärenergiefaktor bei Ihrem + Energieversorger + (meistens mit regenartivem Anteil)
+ Strommix: Meist bei Wärmepumpe oder Nachtspeicher.
+ Koks: stark kohlenstoffhaltiger fossiler Brennstoff.
@@ -276,9 +298,10 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an. - Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in - Litern vor. Pellets oder Brennholz in kg. + Bitte geben Sie die Einheit ein. Die Liste passt sich + entsprechend des ausgeählten Brennstoffes an. Erdgas wird + meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt + meistens in Litern vor. Pellets oder Brennholz in kg.
@@ -397,8 +420,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Hier sind die Verbräuche einer zusätzlichen Heizquelle - (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben + Hier sind die Verbräuche einer zusätzlichen Heizquelle + (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel + etc.) einzugeben
@@ -427,16 +455,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Heizöl: Flüssiger fossiler Brennstoff.
- Erdgas: Gasförmiger fossiler Brennstoff.
- Flüssiggas: Wie Erdgas fossiler Brennstoff - im Flüssiggastank gelagert
- Braunkohle: Fester fossiler Brennstoff
- Holz-Pellets: Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff
- Holzhackschnitzel:Wie Holz-Pellets
- Fernwärme, Nahwärme: kommunales Wärmenetz - erfragen Sie - den Primärenergiefaktor bei Ihrem Energieversorger (meistens mit regenartivem Anteil)
- Strommix: Meist bei Wärmepumpe oder Nachtspeicher.
- Koks: stark kohlenstoffhaltiger fossiler Brennstoff.
+ Heizöl: Flüssiger fossiler Brennstoff.
+ Erdgas: Gasförmiger fossiler Brennstoff.
+ Flüssiggas: Wie Erdgas fossiler Brennstoff - im + Flüssiggastank gelagert
+ Braunkohle: Fester fossiler Brennstoff
+ Holz-Pellets: Stäbchenförmige Pellets - + erneuerbarer (nachwachsender) Brennstoff
+ Holzhackschnitzel:Wie Holz-Pellets
+ Fernwärme, Nahwärme: kommunales Wärmenetz - + erfragen Sie den Primärenergiefaktor bei Ihrem + Energieversorger + (meistens mit regenartivem Anteil)
+ Strommix: Meist bei Wärmepumpe oder + Nachtspeicher.
+ Koks: stark kohlenstoffhaltiger fossiler + Brennstoff.
@@ -462,9 +498,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an. - Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in - Litern vor. Pellets oder Brennholz in kg. + Bitte geben Sie die Einheit ein. Die Liste passt sich + entsprechend des ausgeählten Brennstoffes an. Erdgas + wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl + liegt meistens in Litern vor. Pellets oder Brennholz in + kg.
diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index 3a0b7036..33184d2e 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -159,7 +159,8 @@ } -
-
-
@@ -1009,8 +1008,9 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc bind:ausweis bind:images bind:user - bind:gebaeude - bind:gebaeude_aufnahme_allgemein + bind:objekt + bind:aufnahme + ausweisart={Enums.Ausweisart.BedarfsausweisWohnen} > = { + email: user.email, + empfaenger: user.vorname + " " + user.name, + strasse: user.adresse, + plz: user.plz, + ort: user.ort, + versand_empfaenger: user.vorname + " " + user.name, + versand_strasse: user.adresse, + versand_plz: user.plz, + versand_ort: user.ort, + telefon: user.telefon, + } + + let services: { name: string, id: Enums.Service, price: number, selected: boolean }[] = [ { name: "Qualitätsdruck per Post (zusätzlich zur PDF Version)", id: Enums.Service.Qualitaetsdruck, @@ -54,7 +71,7 @@ }, ]; - export let selectedPaymentType: Bezahlmethoden = + export let bezahlmethode: Bezahlmethoden = Enums.Bezahlmethoden.paypal; let prices: number[] = []; @@ -93,6 +110,38 @@ window.location.href = `/kaufabschluss?uid=${ausweis.uid}`; } + + async function bestellen() { + const ausweisart = getAusweisartFromUUID(ausweis.uid) as Enums.Ausweisart; + + try { + const { uid, checkout_url } = await api.rechnung.PUT.fetch({ + ausweisart, + bezahlmethode, + services: services.filter(service => service.selected).map(service => service.id), + email: rechnung.email, + empfaenger: rechnung.empfaenger, + strasse: rechnung.strasse, + plz: rechnung.plz, + ort: rechnung.ort, + versand_empfaenger: rechnung.versand_empfaenger, + versand_strasse: rechnung.versand_strasse, + versand_plz: rechnung.versand_plz, + versand_ort: rechnung.versand_ort, + telefon: rechnung.telefon, + ausweis_uid: ausweis.uid + }, { + headers: { + Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + window.location.href = checkout_url; + } catch(e) { + console.log(e); + + } + }
- +
- -
@@ -193,8 +242,8 @@
:
{selectedPaymentType}
@@ -202,7 +251,18 @@
- +
+ + +
+ + + + +
+
- +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/immowelt/wohngebaeude_immowelt.svg b/public/images/immowelt/wohngebaeude_immowelt.svg new file mode 100644 index 00000000..3d694ef7 --- /dev/null +++ b/public/images/immowelt/wohngebaeude_immowelt.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/right-sidebar/promo-boxes_immowelt_CD.ai b/public/images/right-sidebar/promo-boxes_immowelt_CD.ai new file mode 100644 index 00000000..30a24cc8 --- /dev/null +++ b/public/images/right-sidebar/promo-boxes_immowelt_CD.ai @@ -0,0 +1,474 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[22 0 R 18 0 R 19 0 R 20 0 R 23 0 R 21 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator 29.2 (Windows) + 2025-02-09T20:03:59+02:00 + 2025-02-09T20:04:00+01:00 + 2025-02-09T20:04:00+01:00 + + + + 256 + 108 + JPEG + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAbAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FWmZVUsxAUCpJ2AAxVgvmf8APD8sfLheO81uG5ulr/otlW6kqP2SYuSIf9dhiryLzP8A85fXLcov K+hrGN+N1qTlzT/jBCVAP/PQ4q8i80fm/wDmP5mDpqmuXBtnqGtLci3gKn9lki4Bh/rVxV65+cGs 6xpP5NflpcaXfXFhcGytAZrWV4X2sYyPijKnFXmOk/n1+bWmUEPmGedB1S7WO5r82mV3/HFWZ6T/ AM5b+e7ei6lpun36ClWRZYJD4/EHdP8AhMVZnpP/ADmB5clCjV/L95an9o2ssVyP+Sn1bFWZ6T/z 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 rsVdir//2Q== + + + + 1 + False + False + + 272.000000 + 112.000000 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + IBC-blue + SPOT + 100.000000 + RGB + 58 + 74 + 181 + + + R=255 G=204 B=0 + PROCESS + 100.000000 + RGB + 255 + 204 + 0 + + + R=34 G=34 B=34 + PROCESS + 100.000000 + RGB + 34 + 34 + 34 + + + + + + + AIRobin + Document + application/pdf + + + promo-boxes_immowelt_CD + + + proof:pdf + xmp.did:71f7c921-7cc6-f647-a871-be4eb8e3caf5 + uuid:ee55951b-5b21-40b0-af44-62669700731b + uuid:24e93842-72cd-4d84-b6a3-b36e5bfa434f + + uuid:b9b81f05-8bea-463a-95f1-d0f06564ace5 + xmp.did:ad25bb83-6ad7-c84c-be69-dc27307c6a15 + uuid:24e93842-72cd-4d84-b6a3-b36e5bfa434f + proof:pdf + + + + + saved + xmp.iid:d674b358-f634-e94c-b414-f16cddf3f62b + 2024-05-16T00:44:19+02:00 + Adobe Illustrator 28.5 (Windows) + / + + + saved + xmp.iid:71f7c921-7cc6-f647-a871-be4eb8e3caf5 + 2025-02-09T19:52:05+01:00 + Adobe Illustrator 29.2 (Windows) + / + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/Properties<>>>/Thumb 27 0 R/TrimBox[0.0 0.0 272.0 112.0]/Type/Page/PieceInfo<>>> endobj 25 0 obj <>stream +Hn\7 FmݢMp +$ +xbOEEk+Q9~C|Q?>ze`[Nsۧ?7\[ZnZp8ZYrd:R-iOf϶—jS5xNv,9y3fKJ/TƑJFc\ FhbiIb_KjVԴV@GJEŁ1S15 ^ܧevP2.g&PeTe>:/.+jg,G&­=ő/[v,ݰÓa*'C"@d,*D,U[hs3,rժwUt|zC^JGCELWeQ#|ոJ ]:Tnz8;@Ak)B46(DPކT혀]S'ƅ@Xhy&Z3 Dΰ<- e@nd%: zQ{2@ ֜4* q 4S @P{ VBluK2,x6bjE +uѹ(~8DP;)=3#)Aw< !\<ƒzH肩..'_s 8Ԋ\ FDDwC"Әr d8 8 * +eF.- ۥi],M& sGS^T%b!*!#Z4OiDPC&&,&>q$ 'bhqU0VC9.U@w{ L eEZbQ&}Ty2O.c .^sFIZlN[f-7ЬpXNs=d |eZl_Qo +o +oS2 +endstream endobj 27 0 obj <>stream +8;Xp,*=B14i&Z%sTT'.!@L*.k5XDIg-BDR:*25Io)o/X!C'IEL5VQV&cC?'9%'YUF +-ihL#Qn[19aQfFlJBY`f/9V5U@bcjF7M2(O!!!$!rr<$!s8N0$Zb=oh~> +endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 29.2.1 +%%For: (Robert Jagtiani) () +%%Title: (promo-boxes_immowelt_CD.ai) +%%CreationDate: 2/9/2025 8:03 PM +%%Canvassize: 16383 +%%BoundingBox: 1 9 272 121 +%%HiResBoundingBox: 1 9.13841515346576 272 120.500000000001 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 116 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBCustomColor: 0.227450981736183 0.290196090936661 0.709803938865662 (IBC-blue) +%%RGBProcessColor: 1 0.800000011920929 0 (R=255 G=204 B=0) +%%+ 0.133333340287209 0.133333340287209 0.133333340287209 (R=34 G=34 B=34) +%%+ 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 9 272 121 +%AI3_TemplateBox: 136.5 60.5 136.5 60.5 +%AI3_TileBox: -272.71999168396 -220.420003890991 544.720001220703 350.420013427734 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 2 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 6 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: -62 221 3.66666666666667 0 8212.90909090909 8180.31818181818 1717 1044 18 0 0 -1857 121 0 0 0 1 1 0 1 1 0 1 +%AI17_Alternate_Content +%AI9_OpenToView: -62 221 3.66666666666667 1717 1044 18 0 0 -1857 121 0 0 0 1 1 0 1 1 0 1 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 676667 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:-823 -480 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 11 0 obj <>stream +%AI24_ZStandard_Data(/Xtj:ENp8?7 s=ً=i۶W {aHpgW ߣ?:ѕC,sC O ,'Ykqi}w.woǵ2׷no㾭wveo溷uZ^q<-[EerecYGMR|ovw=nr;s7|;8<"9K7omm}6p 7q7r+ins8㸎}ȅȍɕ\Lwq: ;;+io{<<^艥uwcveϟǿ}_5An vvA0EpIse:! {`b8dXY؉]DP EQER,~#88#9c&5INn$GvGv#A2$Er$I$s]r++_ a)cIeY8]DNp .E?3e'~?>c;{V^eܷq|󰌗, ~]oL7=,6 ˶oiRXs/n؉]9, 9:6:,㜗ò.51`m !~ p y09,A$AA,`=;75 __}}}۷}L_Nv]b;{׻uoww]s/==yy^qq{^ʮNzu]u\u۝t#99yqmqns\}۷y[q۶moz[JN< x87晗=nq6{EjPkOsz\oue&垻- cD:Iw]գ[է5ĚB\uy5TeQ.D" q}_:ݗ/]S=Aׯ +z`Ӆo]7gXԫtի!f HߔoA[QJSU'RU=ETMCe]}}T],CzOКW(?(j`V= P5{/իq*?>0%MO!_YWԉ7%P }S2Vn5]TЩ#`jM5EE+Ve?hMW}Wr" >ZTӷ79y_CoQ0ߝbYU1<>%q?+I~[c5޶=Zi[3:c7[|JbV&۶Ӏ*=WV<ʇ'OcBKe]z 'Njz|[zD~Oi[7]G߫P&z?x"` qq̳9ia}<7-M{ӞMQN洎T[_8 mղ?]߻ jx3%x;o\kK%[sܾ8oyZw-c-/Ese_rm-cu=ݿmZ/14C}ȯNa_;{녀+[2X}6u'd0,kƐ_-}OEp8ţX@ +FS#5xRª_wM=)5u= ^MV>Ϫԩʂ֭~\_86PuRP럟ﳫrX =_}I;+vFWV<#h P 7 )Q$L]$$VVnP,GUٔb%z=UTz~:Y~? Jd݁8}W[Hxӣ{ Oh*TG!D9u5슿"JXyZǫ)=WQqT7 ~M=(mhS5X?%wM5F\]UʯۺRm۾ߧk(YZ[ M)]N$784C-GOmJ~zo{95z\ )/TCz髡_-v>iz+e@j}P֥}5=}^}jj]G5+:UVCJ}]ʦP|զjMQօֿ=sܻoPK@mj[TS_ׯNWvw}t)JCM_+'{Q0Ŏ}}-YoUT{WUJsTUw5k*zX՚ٲTjO5UUZVyUSؿrږo"оܭտXٔH܏~\)͕TX"\GyWa @U@W74<7EI a:_`p\JG΅qz׉)֓bԨ^(D{Uy7'i|S) ? +a~dDۏ3%z,/W۳d7g*J=]Zڢ;[!Q6 +hY) @UJq3m q&>f[j;8cY7o{[uiOv>};y}2%lDBH&/@V,h=ʲa笪ii/teTXVqM0䁱 `+XB%3YcXc 1g,3lʇ^-Xlұenb+JR+RQ*XcW xMO%Ŋe]'BC.>q +>̂Wک`U^/o , S2:>7HNp! ٠G=yM$D+:*҄CXF21Ȍ|H>Ny::zy9 eNhDh2hdj8 +#P`pΉ#Q#Ab0m\J=6&20zV1zV%tPY bͮ#ٓm3űC ka$ˆI.N@0,{i+of~2+ kgv @cF`V3{E*@ViƇ +4Cရ݃y9|/-;AK$"O@&g %Qw to"UZ .BPmWérRkl# D0 k +WRɎ*6dH|#ű:>#z@3E&zO qCD`M q( +-DAnG:pLT q-"Tyu8,=r8䗉AGstHZHa`Yl';9pS>;J.Dp|M'[gOzpVAf ,h"Ƈ:'Px2B@lPIb4 >NEEbwMAl,gVQXbc`ߤ(`fw+xnb!6-+*S@h2Vzd#i(jMaap + e (/ 4H%`Bԝ2J ȥnRKA{r£#cIb@pEBA,$

d <.сa2 yc` P Ds[RPVQ͊9b`eUdj5Y ,%)ڄbq@(P%<HwюpEdM!qE! E2P<'?ɤdu +-ϝHv͜!fF8l'g-RZQo>/tF1yiQ'|v*-F+BP"uP +xr&taHў@Caen7 +oiG¥Jf`ـ@搉cy#=/% @VF4;>L r)C ,sQ@CCaCU'!U )A]OGp0 'A ,cqnE|H lRe.H^õר Sph#փΐV ]p+TH4<0nP8 +?Uvr/?ss+ҙ8xJ4"6ES,"<:KN|~|܇]2OPDdApP>Zet`MEH" Dq@:P"AKIrOw=opX`ꉏleNvA6&JnV + ԨAWHW80a$NF6q2[54: ,0tPt7"dTqyT +E'": xd\.b/pe&4QL\C!*Dр& +(4bbuH*Z@D ']DqXX#` IewDTpee$ y: JlHU"9T8bDMV E ,_)"oTKOd 9RhFM?dRW> ;&2cB!"tDr;h 4[X֊8aTdb,}& +%Qh&ODaH!Gh8DBɶ(l#䉛3dUfCi-J3K rE&EEp 9ǖN@yhD$da$fGR)#"8)?r}E`[0ZLha4I"{I}ahڦh4?$ķA\gΗ]=aQ[>K+nb?+Ů=QO5MS\離f暪߷hE;u?@3uzbfwXp-bSj]Ã@]l.Pӆ1Ѝ ysDĈ1:n)`H.D~ȴ +FrDY_l,^0^TܩCQD4<}(ȏCQ@p !HIa(VM(@;UҞeA!gPtI&&JũB3L(ȄCKj$h"slY|Eq(,qAga {91 RԔHd7 W/`Dc3]*7<2EAa^MwDЮL3ԙh@p'`Do?-T5^r cpw#lP"!&>(D_i119y2m41iʜW´=@B@2S d 8(:Ʀ\ ,3AV`qZ$*#Bز,t'D !0+L #SHZO3OT: r܇}*&MUEMtQ.J{XTԺ8vXr4DǞL8T{2L8TyBHq Ϥ5&I%-g鐏̨Ԑ"3%|^% d@{d%B-B%Ӌe8^%8.Gqi  ǵpN ; (Jr*[S((b$;y1&ɼ&*)Rg)1 ,k'&D0$H 4J06PF肅clh(8ZJ8ЯT & hcE*FJ_CJi/Ty2wCF6L{WlJ#64ĎPJ~p;Q& ARLRAr I›G1e$Q X@C1O(CrPRD)tRO&?pq($L8ДVqB&J ũ #!H%RItL8T9O8Ti юB a LDhɐMOX."Nev e;m8q4,pqE6l686 rH4+WJa!y ]ȼZѬ&|.IǮ..ǎoo.JiqnT䁺.J#a 46y.im$|, L  E_Ax( JyIw4>-ȴV] 6 +'nyWIr 6Ԃ;pK6Ma&4 P0G1iK81-,emx0m"…2dv4rH@y8P  Ex}d1 cCj((}A$Ɍ"8Pԭqr@|HS5F nVZ.K21e %*21Ud:DhB9>@d~c236:XBQi;.(X2.dę8qZaptt%X~G,3-*o$L&>w|d% #cRLw|d$ +%NQq1.Ё(v֬4G¼H4S)ܿM4űVsqlد&j~X:@?8v[G8|=', ˪ 4?̄gq5$ ʒB)aQM8 uE C4"0@I&:*"PDL.:&0*H0$bHQ SΙX)Q=g~}s8E%Bv%ZE#դ3K0^ 5n뢴Sxhjt@0 _P3>tpq]01\xUl}!x*@z$|=Щ ] 7WkJ": +mNN]V =5MJwAVDU?^gqg%>'20N +(BJ}WdV'9uhf5 +GaDIpHh*8ւ+-xեn[M)bR'4-5xEBWݑ-8j)p +M /oz#ΰrb|uĠ7spswlݼD,Dױ)+.;}Cqe8|Brw[d*g%퐩:a.F۲LOgbn7Q.ppy{8_Ojq^P|֯|!@2X~ZmK"1ZBk8l}% .~c!`c KEl_mMƲl~ +{XSr>Jrx!9d$vGhiA2e3(bc8N܆ a\%H?' P+A8ð4P?Ùt@`C&?]?VÌ 6^muasajkۈΝӌTmƦhKlugΎ/{'">ױm]`E}Î\(rhZg]*p~m|,$w]}dpa&jBE"wcEujߌX6]4QOwBb]#6qFB}:!YvK%Q溓`-$z4,H@2ωB=ȋN*gkԘErcz. ] s.¶$XhʧՈR"MdO4cFP^'M/imN#"BP{ps Cj-IE͌;m*?HKHf"Y8.rw v+ـG[25U5 8>3yݥnGY#d>LT.[.kԲgYα/yƜGGh3/6 )ge<fޛ3nZ{rwnY9Z۝S ]ivJ6ęD(]knۆG(m7N`Lq'0f(>l{.)A?GKߊt CCj)C||E[_Iv#U lvQQ;[K,Vxc4 SZ?vFQnNx[jhWp4-6$D{AsXDf4ЅeUS3 cG8GS):H"">924͏BB~ cGb-+ןLV`L-!ɴ hCYvi{~秕HWy^Zr$lD_\}^nQfkLq;Б\Zïݺ.> e0 M'|2 )RZ^g +.lvVZ$.1ˍ(~뭑IDib]"L3)u6~PW&H[s'F|\~:lHXIJ` V-XYmڂ}b4/j/!2[NoD޳{T:Ցy̶Ha!Np$eseRgV  p<5}\BArJH'xZsg_qx\y!Ś<";tELgv>|kvܫ#8vx&9'Wc{qȭpl~С +ZW }Cnci#*|Ȗ==A%R4Ww\ 2IzĒHM/N;w%0hVs˛PQn  5ȋ .zVUچG*eh9_u\ț F;}|5G]/[\pE!\%(ᲴΣA*Q{VEI}?&/C+x4 YݖeKuj2n> kZ(&,U"ђRK_y +z5Jx_Dg{i4 .">9W$aJWv]/uڀUb un(6-{:E Cx9{ViT%~/7ٙ^_]cGWWE $Mb_Q u,bHp?0M]̈́:*A8tr>Ec{ِDTץ wNZ?ef@Ph-0CЌ>"S FΪQcV +q J3dԟw<@,^%Z؎/\4x"Kݫ2>U1f/KԵɏG}ɀXfâ[Lue`So؎2h-ӐyfܮQN)ZPNI< 1ɥ6bu||!?+*@rYq5Ok +f CFF[G:Xu`wuMN?dC%Z)34T.M2M& _@iɩ+{3 jr% +\5<AGJދ +q*8|UYG>ww9eAEʐ9:JL";k ц!ϓQ٦l'e*UU'Kw]tK psy/ՎOl4<} pK [U8QDw]VtLw8 3͌LHwJDG[;gu(0Q.MwBWɟvB$k,+7-WQ!S2ڜE#7cp z2Zwvx_hZG^4&'(^JjݧfuH*_}tڃJA2ei[^ ++jivhN֬s +2 M 6dۂC`X}.|Ġ 4|zѢԪgU8^͌&[{+}4d$&=roZh΄Wn-?zS)_HgbE_YЉd3 R抉f;%65:3os(`(_ :%@k69#kA *f``k5m&0CCB}m$GOM/oX:HQX͚~:{!h߰EgMVɲ ,JN3@Jy eTŖԟ`ۡh,ܶJe+6E4YOz0țݪr@E254FPz dPg!Av QѡXyAIvG%+4;CхwW^7V$&PFI ԯu1?cx6%J9B,Ǧ]Bu]bP%-nvclCiSLI:*ykc֙64NgWʊL>ڴ-x +[z>RCA_mls6,*#ȳ;y\(jC Mb@$|*(B3|3^ " *Nx-o1NRNӋ_Z`DjLLs#G-zBNXI!Uɘ8tdL#E @i2_Ƭh}#)DϤBJ N#$,!z,[x?ǯXW?~'p]Z +wJ{x_'6 F¡6fpJ6rKhөxuɠg;3 ) O=RBEL˔vï>eOhfp X6Dhڙ/b)-]Dw!1z̗vdX=)f5ځMҐ/=k_ !堦# GJDi%A+vSݩ U^'"F +Jl'v}bzΚ9F .;|hjICSKK2(CEkўbOA03 +Z]PQB]%y& N[kp'TޯIR^_6RtIt~c߸38>؂V}sA'73TMI1+d#ыܲ!õFLl֡kfdsVXNf>O;UD]\'9Pv P4PAt^~b@ [.7碑t VÆ)vRf +8>=:w3W=Sٶ~2)`#Dkھ l'+M T_-ԩ)z2\9A>LCzp[PM4h45i?}]ʆ0çsT#dfk]yzWЙx# &pNH] kFp0\ٌ4\d?ڀYqhi;+ [i͹2۸ԆzȐICʌ\\pA{5%9iFWQnP `tAB|4T DptD@:co# 3Ț@B`]#>GgE&nݖ꒒#)0e{IlV +lZ[`pN8BҰA`ia2Ӂaw8,psKE/lfÙa ܡeA8_bnEܡGP<89~`pMG eʋtӫ(lUb5_G{dR52)Z&Z[RS;,%bqRU:(pIfHV#ն8l6Hb op[RG_7Se<ՏV-rʷK"hG^Ft~]aenSpW*.+aG] 'wtNosSG!,/$c6qhJ޲nF&s"|h AI,iޑ,wۄ%qgzrPa|^/ C[o Сtj  03P4OB|X#mY4vP=+(!tO8y ѧt %ufHa{-ߴDKq7 O% a6& AЄҝζ= I } #>`wp,L5ILJ*JAU8/Tvm$D="ǩtJcq|V|]Ft@eC,u5%*^L/qS"Щ$;{՗PY; }Yd؉ +Dg`DR=rY9|Fйnwܭf ϭneJ0S=dz!u$*箾*IsޠR[VyO9bBʅ5@5p i$U.gljhu'Zp7lQ-zPR6}]qwjPfTJBF( H(P祉hRTstt5gXPt}T\Mrr)yӁm3V97ea.r͎-Uq jR4_ `"<|Kк*`L]9އ u%1wGcayWO`amcfh\R2:D8gP+;ſASz^ˤ +q!K\M{NH>3ٍQfl}z +^@\m0z-H, fYLtx]/qњ,SJJTj2\Tw߀! /bZCNh과'ow&jDo=LR}o$_NMq+\Ä8eѢYp1ެ{l=Ji:ܵ 3e%OhkT`[M,4js>G,\JM*gTjvt+1D7)j9Ler +2P,tAɵXĿGmVD\!] 9bPoI# TG Z rb3*].Dv! NI9PON7uȳ$qx8fKj d ?Ս:C?6U(,}:2S]u LOjL9h4 +:V]ۦ&W;|)43OKL~_0?3- ҦC'X %8X-rh,dsՅ@ˋ?hLo4ZuP<0_.C7hfFߓǵ&3_+tR€EjYEnc2( pl]@vtWfDtN u|Q(T ~c *̽Fn GR @!/e ) 6dD Ձ"a˸m+p0reL[c;ɥؠ]6R?!D HAx1#7oQ1RF3WUC' 3@q,:Otrc -sl5fe,!At!僙kӦڨfa~¸(*z*Krje| 55 z- {AajFl%u]KWD]abyD>]FW8gA;C0Inu} eĥf$ѕ9bA2ja>|wNԺ1T\cE! Գn%yIFt3exVW0K9_eD*xE#ZD Y +-0%6g>J%)aۉVlqK: ;IJ0{t6` +ɖ3i+FmVe` QL FSGVz.K#JEdMJ O4J熤̐Lc>* R׊c#bLaAA_Sя\q :<;˶?0 +btNd 2\lay#ZQP'oo0C+6ޖ |ĄjIBlvzYzȢ)dBO}AŒn5&ՙZ$5S33v@5^"6't>TxX~&i$+KVs&ϛX651hH@kuD@jV& +*LcydnA2閂Vh`[ +6A.Q;52 !rt}J%phS:_CдwFmc/nGق NN +)Eewšro$<ך\\XPt?MD &ZJߪeDt1lGw\ ->Y4KLu!@?l/W&66ETJc*[$,=f|=+y8,-#(X/"(cx#MTzc&B2C]V.`6,ܺJ" Co F"d:y/i +F$P݇/np:N'69|f f$#[3x8@u܀ؿSnLA JUvzUK;!5^KrƽJW1ZSS0G4{7*F7SF TӵEQ!+3`HCG I + @ =.&СXvj;$tCĎk)AϜS`hI{C!g32K" ouӯ7"z :" V8*e_a-<\$z6O*:+ʟ'摐(o^)J1, +RhraThvi1<}v۲@{jmNv?f^`xO}BNbԚzl_|j_z-3G~  +/=x+r]K%Bٌ75w9 \c*ay86`8Pc#/}CZ]?<:CD +G;f sj7:+a˂:`~=iubp])n}O[r^-nHpFrگ#S>O! h]-yfQ zGFg}-dǿߪuk(}e?D {mKWIU<P{p`=Z)F^b)F&e` +tރcz=>YJCZ ٙ~zG)dΩOMi}ZJ\X:kH"DSuVӺ6XDITS*nx9t̡ vg0H05q\b]k00·`Zǎ" ##tPve&ijٌ켍`g'ŨkX3v/O$Li=z<%Қ5$R6~%/>LH?0Ww6I9<(ELk3b(b("aHPDB*z\6%f*/8!223g BW7h` ,v1k`gY%8?`оqJWm@FiN:✮غQ9OIѦS΂!P^wPCDNs>rˆdƟ +-FDܰV$f4;=e'33ʨ>ۄhxHQ(HnZTm1%.om mK5 QM 5FaR^/5P u{g~X]ϣ@wo㼍 qK;c$du.T(JW) ׫ \K{[Qڸ6.ri԰@N + JƹC*]( ({G٢%)4GMqS=T];6|Y&XJ6N +6ΣB:H&P۾|OݨS^mq-7GulH_y:ŧ-g೸ع۸ +SaRk|R@ m\n2i+*ډ+i?"(jߨ +n+9C +"xiP];,COȨf,EWKTan)5,LQ(-[(-BRT ƌ.~3VqI[h1)yE*+BA%AA%`e;HqUo3.ymq롛i u"Sv!b'~oPw~ C>vPo +xk2Ӥ(S +6.6y68o6{>m\ݜtn?K^aN"l4`',2ރ3T{{۸ؘŸ +`ك#&ᕺ} X>`V10l{\![5 6nv 6߶#zM +|-m)/z"56j6UUK̂6D +OF,BPɕRJ N0)D;/A#oy9L%vq'7Fq& Eij9u(a%m8 (XeVvFMh2~~Pv;2Oƭb#@Њ4/ a|]f[6눪$A:5g;(]N T褬֠?x&Q']+uվNױuܵ6G1g3t{ԁ .ɨA6hƹX$N8AA.D܂'GsS$of͝IoBw^=(NÆy~b8\8ЩztqP<ܯ"Vɰ&hN!aC<7վmh f&9c e=򣷞D=I6`PGd3SbEb HaYEs |j*_BuZʊp<]7McnudC ; ]z'dǠKۙ}3VFh>޷z~0iu/z"O T~ )ʰ5VؚSaj/S$7'.񮈊+>*Yɷ}6m' d0LNEP'DYT?|)M`:qE8o㼍x/`l @-0TZƠa`#=>iuQ̻KhD#sc֮f4(!c/@$p<ZN=?%m,`Fu؍IG}';QzL޼#R}1!8Q`nwBphӘU"J:Z{Q|'gb+40j] G:ᖄa,GGJ=g€n6TS>eMIcFu(%xL0NEe`0|`9_>!ܰaN"45O@NT.bF6>>N鉜|) +H( Cc)_HdDVhn~jIgi5ט&CWE&xC@ 9l'$dS,EQ6sΙ_c0'-e}L 'n7gOd LKjUCAMD̀څa8/֫@WUVF85*+йߋ<Ъ! @o%D2/bpdq<1Q nO!U4t5̮@/I)lK. ۆKPu'ʀ1|03<^ˉV6sX\'RXONH7^FDPԏ( p]8rn֪*(Hg'+ q5mHO)sRϕ9 s.=Q]Lj)>;#nDeguƞu ϴvDcFf  s +IeD#"N*s:(OݜdQ&_P_V鰷$Qut $Z)&/.n.+8ZtG,d<߄+l)̆UV2j~hFۄM%,}[H0rkHa/c~4#\sf>٬Z)gߓT02U ٛh$ Fظ - xg0r&)a]'U]aT G70 fF +Sʣ +(p~Ą; dmٔQZyq^.qsw闶Is.=D"r˽s إMm^<վ3Yi6i7}T7dm:"{yj]qdpk HϱRMՐ!:]N A..Yl Bq:.NQhjZ3-ql$$2]eڍbv(Nr'A 6, (_gzxOAo^+ŇPjhLtUN9i"#3)jbnb^7CM}VZfE"FFF-f AbPLq~BS]wМ2zھu`W3cҜb="ۗ. X74a;$ \7ˎ;Y׺"iN9٧(%ƥb7'>C9G +Qun90MPc@b3@-b -Tʽ{ػ8%OZ]zSи[`4?4 >8AE wlu Kc/י*17"] (Jq"S |X|6XjG[Gmy͍<k7kBљ/眈;GIf\8R5~L7SE־%18Wz X0XBCo$tۻ~B(dhsܳf?NwƃQB A'dTgGe49no,$ vF{MtoL$;rW$콩|Գ:Gg[rDg;Sco zOxX +9`q +B~﷨KX vܟqcNp6 } ^ +^,/+X A#]a,/R efHȓa>;K֣S{l- E+Pz Pau` \WyPENJ`PgMe5(TeEQph% +Rlldf-`(>R`nïlB.Qhm@j؁'onF-صTNf"cM؂Al8q >ܒlؐPϲ$ v(ӳٮ 1,5Oe`r};/!ĀڂuB`q%V6{&Xx{,XAtl "X M`kY!ir՝&O5/"sǁfjv5? Cq 6MwY=Mf]nUj#wҸ"SK oI靈 VюWe&K3&UE*ICGo#Qvm OVuSGu[іJ(׻cj:q,]zsOD?;NX1)CJmw;F~CM |ZQuEfBy!/2LЪm>n1狡;!xpȌyO`FuEfmRP[(yO(c="FXSo}tNW+!3b+dYjSG[*)7tSTߡc1ME JR oykQK_`MQIpڨ,e O w.jiɇ""3t}F wBɸ^q5aF !h}Ќ s6VkY?$"lpR(Q]5j as[8*cb[۩j~"Fw+uRzixWW; &0J +?\`'{v+NjW^_Al^epW(`Z)|6WvH!$VfW]'^ȱ3Ev/eeLHk3{zVAK~NsIu˜[|4K~/3 +3< 0u +eVe.8xmQM8 FQ'r|w{nl\t JMEtX˅5똤9NR[Qzp `q;*̘?$|ɭsda&}E nJw\!Eͥ!oZGa vB&2 -{kMܧ3P/Z4]A9pqAz,|kӶX<nFr4?goZxnbjE''BN8iIazR+S!:Yr8HJ"9|V/CV#kJgjM, kx{2jORQ(r(?-W{z +.hZ)/on-Oµ|9YMȧi(\dȎFµg>G5&q ϒ">'$IPT#Qm*hD֘"2MK0q2S9p6!\ʴCں~Upt *gGh2=\hX]QWTڕv)NIT'85L[ yJҧ 6r!p`(Rڣh:q=8 + !6j>95Z M`Q_t4]2srw ya551 +q}?hS)*$UH)")o#&iל}s"G$L|T/g£uJd||yeH8ӨY62z2"#Hi<_tڸ|5LdttE[ȠNp= ,3/:K](ag`5GOᦖ\sn {x}Rg4WWDދ`@_5`@56ϵco65G`s6jA Do.ͻFy;AM5G\ɋ&0bS~#l\sĩc@x\=Be%ыf)QRȻi(:몤PFCu"Hw!e/ +i`@Gq /Kg|߸^ü9qazEð6ёIqǣ_XXǡ5᧼%lє; trG车1ai:{Ґ`5*ieÝ7e6pfB#Z&i yjPi`Ppq3p {mXk (0p PjgyNM98tNw1%9-&!1]YKBL6 cL)OH$Q0ßMu82̓2p(DNJrSLoRxYxPA"ѹ=-p7BЍ89ZBYQR\ȑ0Ељ3ɨ8cY>,xXry"gO"v!<7: 6 , UUR)'S2.UK[ѩ&4k+~ .rD+M% tH!_BÄ։u4jlݩeF=hcbQQp0* w9r`vv)CiJyQkEN}6<;.-|i{mP@ޢMID{{".{5$sNkt~qNkE$j! e+rO$rl.L($}{*Q͋,jeΰKB_S4wT&|Rr eM|VfxlA%+Lx ׃JV越YZJ ^/a3C%vBJVXzR sJV\YxW EVx(8BHɊל (mˣEp82ˉpͺۡp?{m/@Am.edցtF*#)Mt+dZ]a4Z@܌SwV>y%2 >1+$LT(a/mmrEea4ѻVXL\mFԸa!(LAMMU60y~4A'T'J<-QU];l㟣KY | +I݃|Q`JSʃZ +hFV>۹>?(٘"|~Ziу1_KZ-&#SX "lړ$(ω3oV:FdCZ!bV> f߀lA:hE* ,vKBq] mfK=:.]Zgh*!/g=QK?9.7M`%p6>>dҹ|%|c qJrQU+Qq\sj$mg?pMA9S톊.sMuP'[ +Ҟ[(b .3Ey>G^#1^Dp?5@ +TlȈkh@)d|#bo "\`!4` -ta`R HBsi8hN|Qo#hg_;:˟O$@ێϚR|!Ɏ*ڡ2YXy"Ȋ+^uM@X|o\y2ưq~rO  v0X{v  `8F>ѻhJ4),L,&/ځ5a?e%^FqzI>X + q`^L'LmV 3 AB3LzmF]9S1mHז.y&&[AᲚdpaم}z9m)7aɡ^BL 2ʑЈK ȯC dq+ܐ436>, R¬dx`rJ@ {BA&PAe wfSg9+3u0(NHC.`S®ꑈ̑vo] 3f##M|cB`&Sao汇HY"5x'!pbbCEm||"|2G\[LĢ@µĘAG0Mh"P[kF6=8]<Ʈ-_|L4;YuMz8u>8m[ۥxOI,h$ #mXX 2:4-K|8[逩  }Xduٻ?\黇br^9/Gc<-rZ$<1& ?bg(nH,QlRǷ"I jَm ЦބU-:H a/h{.b5 56"F)a=ǹtbW$r2rR{ "?YUw %#*gt"8~j濫k@3ߓ=Bn"jǑ~`jA)#GZ|YjWo0' @s͢9!{R/V)a2T[)l` D a$+*eg`@B;#Kёi{ig 6vlsϔe5.'K$vJPpajoK?t$ +|— `/=;oYƂ ! /$@մ=DGA$!E5a^x #TE 6jT9L#J|a3<< wh8YiG^zt^(e6弳6:]Ŵ}snf Ր #GHD~V=Ef$fy:$nwP0͸8G"#1PUnMjHHX քPwPV%X!BKOZ?5cm6%|=H|ꄃK g^mgvj^$ .OI$hJDc(xCCMtW>xu746On#[)S݆b&F"0G αϭ^KG,A^P.op9)-ueh-a2NljV\h vyo +$ ++)EDop3 YK5k(_)9'Q&YuZ6/kZʲ_ e5h j1 %\#IC[j?t +vmwo Ĵ6̉@( fhK-d Tm +f7'^MݫTB% +0pO/4+ym[\ړw%zQ:\9H Pۨ)ve=3Ƞg&VrA" 6$}>S~0 G%%27F _!B"q~7hL4HO{O5K64a>+-.<5g-Cgωu r7㎠xUx/z}cL_:x8o1>Z <]OEAq .vDw\):t}ttPΔ6r J%_;}L V*}T)cJ?{fK/_͠3Y#%>B{M ErR~kb,jf.<)8Ӱ.UEK҉jТ#v](,4?Wb>.+IFdlc8^]>>ЕMCр.yvBQ>mxk8s]T? tj͊ѪOTJ>ؗ@5^+LޒcUNpy}Jd1AzVnkm P\^ͷtgQ-ۯ\af=ܩ[@<-]5ٲG%ꧢ '6$P`ZC`(ӂHm|]3c"x"6{4P&<}b!SMӣ<kQ6n0دX]8xkfv)d`PÏ@1Nl\vlL {44-*cRb7RVEKݑ&|^< @|BrG3wsB!3 +4@8C2XCCeÃeҕh‡^n&{*Fdyhndޅ:~PiPt@JdD_¢m@s/b95m0~ Kl_[\jI!xOuyi 5㞔п{5%{bٰ< ^DT#5'EXkK7OP O&a\JWzwӻf#MH?vcE Y$O;&2& gc׷|m{ybd^:z#^alcZx@- h4ۇv>[p>Կ[^ۉ,.bSWE<M )vֿco6D>-RqiN㕆mhd\"k ?QQBt힏H{F 0z?pTBQ.4-nn/*$V+'*H{nP7a_H=Q9(4LƃC: TU~좮ቧQR3UZX]]i9-T\qqob?o&O4(1LCϥ׭xYsyѐSfX@)>ԄpG W_X@AȟWXyL Nٷ`ּUҍt +7ZI޹_\ѭ;N]M\&&J)ƾdI VI+ra;-L`&AF-t˱CHLe I%o*X^~̥Tfߑ&ޞ}>f_+ c9e$UOק#!E;*67Q~yň ɫL>~/F^0_A zEoJx`*e(M*͟1ԑ'$x-}<UOVٺ"9Z$E0pi str"${8˞Rfj$5ilH#W,v6׾2u;{v1jo2)2j7HX_Prbzw~-MEDD{P߰#G[f*.v»Vbk2K5wS3GEףcSqsP| j/XB[ 'k3;86L>˒xuʝI߁.ݸ-)/7-WEJǏ0!;Xы/5e"qEYH e*D VB *UR@gG+YfC5A2`>#l1W#$]KY]PG 1e 9Irb)U] +yҍS&X1 NQΖBrL&WmݲEk TYHkKPިK$Լ*Y].Pcn!JZ~QZq$xpTܘDҷ!-|C/ $"=zQ6!Ų&6-= 'Cښn5-DE9j 9|X4R!Lj,'qq +^|a϶v!m"%ˆaN+F(K93on{Q $a?:WSirH9> ;fR=jP~DI[< 7Α5Un&YkxZ6#(chfLq(xYճ&v]Jc.ǃs&WJx@Hؽ,Y YW,nz8Nu'pj66=7k8~άևfޡ4# Z@VNB(cU] 9`]12 vX4!xoŚ +s-)D~` UÎ~'ScQBYH?/fC@-a3KUh>md' #$cwݐhf $1KHt@;5~[qdiڬ{GBK91hY܊xe䄖r(Xs +D+śl44bmAyyzd 3B# +>闯)F-ԽM ׁ}b  )8!-gvP6!xIZoh]#C]9 7ϠIEQZ=j)OgUd?J `onBju%_q3T, K܌Ds]T@1!EGpSo"`z4'B܄Hol-O" )^1 fp@lYW 5{]hlE CͯQ >Q'T e!+9Dߣq`f] /4B% j0٫z^-Ր-"`~Ft1ODGsʔhIݾ|f(|5e08ں]oZen] P|uȹ( WCVnGz9Ms{l tuqWeL%2 Chv-; "8 $a8Ni-}+evk ;`iZ7bPqJ?i4J] voÑ)NgnŞ*lڟRbLZ81`~)vgwDDwTѡZ^v)>wрn r| 5gc@R%,m'fxdӶ zKR/aev 913"Ay~Ѷ<%@03:ŚF +}ñ!=Yk^xTQ8vicDcHݛ޽7c7+ȻH*iхl:!A7?pI'8%Z8ˉq).dE -:n.WT+}C07>gfu4dQg}ba])fDqtfafjj70lZkkFwԋFHWYIl՘ +'A/x* 9lL ~cN@uX˃*_-Ρ7A"`=eR&zD(zbw᤬Lc= xI]QU*|do9g: wD2>ީvtgq}EW3"E8M`SQ`:sYeѺ_: 'DǬ@_% k.jr}cZAh(e"xhՉ%^A!σ4xZJ˜sj M׈Qz[q>qʼnj+3@ش %:.Md3H[A}@P wf/*WhbV 0ï1pqܞ5€}m8Xqޛ1p;u#_ D޶VAٜG`Q=Q-S:fKJ'*'.-T 2 ;*ᦺESzџkɓEE EH~ ̞`qᗪ#i#}! $:E/dR*[sz/$EH)z==(TvZv<-.s27=d&ŲdҴseBKj kF|GέIvUˊÓܶgӪR4+j<˖ݵTk$N"]v5ͱST ) /-M"u,{;7͎^Z4!S+%*)PrT:'NﱷJQp$p‡a@PWI?8 '.Lt Bp4l x "a#% D#%J@@`A1a@K`PAs +Aa]^`D #!;B\08@C4.|@4@ 䔡d0,(1,tG@$ +dp@"r8b6p|dDyD#>l lBo8@ 6QzECAc†' NB bA!DtV(48 &LQ & &'#:pAyĀ9@HhDIJ$q9BdJF1rka@?HFGjظ(%l<7R`Ca(*2 +N> +2BA n80,4`1@PABL + +6DdBN:DdV"||Ă3--|`, h--$4$H#hrbaс%5(ѡa4 6,DX R &6#B#ߐddK#l z(*\2HGLAC +N>Ԃ5Iѡq|(  Dd8Hä%. BsIT(ؠ 2.01R8,DPEA"eDC!^`4 8:CdC{`L#09bB G͆ũ10x ŃIJ!޲`/A4v9$d<2h\,!JlhZ"la@946 aМ2.xDIQ/4"&hX b7a  .04vAA#)CBƄKBr,4Hl〒4 +0#J0)ɐ-bPx/ 3LBx\d<6 KLQP\pQQ[0lt(C "qsIDE"B (`y !Gzt/z;m6+Aͳ3"c~.h_:D+m$.;جƩEmiȍE;Y}m^J~Z#'ٝ=wpN^Jg>ϩhl?^!3hXyG{1+kkmxNT*+b:'&]g<]\mԥփ߮vWos)4OPw[Y%úxzGll7KѸJL ̘ +O"KhtuNqVruךow߭#󊔢ĹZuݽFQ$J9Ɠyj瘊jXyB<-3TRMMvyLx3Ѱig/ofej 3Q+룵uJ;voRYnRLSj$a5䳫SVbkz9o|VVY~;ۙm52RVٞ/{iL?|.<ʻu3|=CRUlZlδFmk*2?mkMFDi.3~y +s:**;*U')1'{yU.[7wI_VcdF'v??2]2Qcw_/Tm|6D}-7eVGeߎR\vmiFhvoxܢi+"Q] ):)s[gڟ{iN&2[=bN%k +ǞVvk:癝-6`|Ee`6 f`Hl0qqDEV7,ɪu7׮{XEWr'ygԓ GM/[Ӧj7p*ypδ׺VvDkڌBl)=\Uy +jս& ibvѩHќ3s//y\O'RP8X Q*Y<:/YN&>9o_;)wjH}.I{O#Y;D^uQ>v~Wlڟbf!mTTrOZUƿ>j3U1V^zR-ֹGST\2elUkuuiU}R5M=q5ǙTwxuw +/.ԟYdLLk3۽tvlXT]3F/+j-Qۧbjqmv.Q^s.iW1/w[/Ņuپ^fnfl=39w5;ߖ6^ѝ4~ێv0՚vgY)3NC;gY֖wmygHvjI{m6ص缥R;\Zu%soxtjܖ}ҳ/3SF]WxUؕTyuim+)%L;k3MNOjU+R\t<'F;]gu|sZV[D;WľӇǹ?*ҡg+kޱZe"`0) PL DR%Ib"EEK +[Ŗwd\=|%f)nVuyߩxW۷{=^֬U7R{IZreVjm:iq+3a*f] "v2!{{H4vrgT_gq_RA-b/c꫺-e/u7k +Hj$jl0{*[#*^Zf.=[JlZ/K&ӽV\D>^ΓeuU)s'65nn.id*_Q+o9Mi(NQѡxyiX#+'1[5!7./vm]VoUy*ӥK4jԺz 7w)MTdf^]+J=Z1Sa/ero>MpW&%NnuK̰>ξ3'[鸤 ǻl2+&exִδh +M͈K68ѡ:(&H煷Vw:MՒcvmCRl0فQhfzwy]egѾwˈigZ݉dEK:X.6m5EŅujF[2Ȕy񽬥ŔirϺ<Կ{ao]na6''#r,2vzV;S+EEɹꪥc{y4[phI@OVd[ܾ{oOL%)*Hh_~J+՝YsRr7vU5)*HVEL|sѮ;il0 Eʼn )*N[ooSp/:N-)UʙJ%|z0sSԐHQaBsl0SwWVfA+LL{URT۬>>Yo*W~.Uۙ#EJ1iES*1 +B 2fhFH6@ 4&8K@DH0 +p,đ11J1EhhjFi d5WĭjNI]֑ =x8QŻqQnR3{`K4/K "WB[Rse p +'hKu( :4p]xz ݢt +dz"M?V#L:< cɼ*Hn7$xh#yܸNM i`<~*R/N4S*V膼.1M]K|X_Bk"Ktf[V~Vpsl[q +_ 475=/R=u_ I?x*:H/$T+x^+!`wDG(,\ުցWbq([]aD Kn] +ZP*9xS+PK(@h+[m`gWCsm`M7* +Aw=.!T1QD A X- I?Lv.S+BQ䘋=1r"CD~Bb-x)#*dYHFjlbd|ӿ;'Gnv=Ssg3z LVs7wQ 118`xb >ri 2#x q3#J*C0]EdLYH8,~=gACܾ_(pMH 04 AsC'.ɤE,'%_g;M$}#ZsqGf +s65ljZbT?M3v9b٫ *xR96={ nY$-] )Ѯ%_wrdR%^U3 :5Nl#:B%3BA<=dCA&w*tYcڱSMYH9YQFN$Eқb}ƃYদҏ>cU[B'9"JhZgDf])Jƌ1%w?Gߒp6i+ D + { PnBI#W"l+Klu ˚[[DELÂxB7l\g!Uul_͍TSFւ EB_#4wNRA%Ju !wY5 i$"65 /. TXDU(K*Rkйs +UWHIAؠɰR|!,e +< բ9#vĪ"Wj!HiH-:YpJ)-,;.JRVh>ТI j|7ܔ7 6mƟq{XnR7>5DYoj,gJ 5'N n|O gN#,Wz;K~$6x@ZKG#ŹBv"3%~mZ| +7D2ԩ;l:6UR^6 nsA*/C0!T<Ҥox6Ӳ0_O/Km%) + +u"p:̶Qkh@jjҐj`fU(ec \,X,F'c&90cR/و,t" ^1I#C2ՖCf >gd', LГZ>Z0Qi|QWǯ3k+BU:/Bdk Z %I^\w e5^T*zN$=,=vʨE[Y(}d:۫# 6B(d8k(r9M7sӪmVjɳd7ZR 'MTz]':a{5f˨ۊp^Qhּ($Q,Or"}Y=cP +BN/eKPQ|J)[Ib$[{׽Z1UYs! s=Z%ɰ{2>/>i(Un4@Bo>Ӈ[)8ŋTۋpzό UdɽNHk+uQޙ_zf|_;cI`bM2·\GF.Upd#ϫ' BV:T1 +@\:1 cA\x<:$Tl; HDbqH)Jft[g=ӤV 0{O;hs@2jΞ^ Yk #})}0 e kt 5V h8,WI1H?骑'Ş(; + tB-- 4kBlwvwX5)dyo(ffYpr&EHEW"}59oU+2[jSvIH:q,ޘ.PtMeUx |H\X4MuK׳FO/G&پ4VGs»/u8b#oagSTBn{A[w~凼GӠ@S^IyMQ=; Icr!_`@b#x nzE/mSYRvEt/r[ K޷7F2."_$K*¶)rIIՆʵYxA'&Qy6J8$!z\o0-e唭{8t8b *Huң5z]޻ﷇu˸rh\'g:FcW Ө'U ?MWDcՏm%'LkD=@UdU6 +endstream endobj 28 0 obj [/Indexed/DeviceRGB 255 29 0 R] endobj 29 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> +endstream endobj 22 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 23 0 obj <> endobj 21 0 obj <> endobj 40 0 obj [/View/Design] endobj 41 0 obj <>>> endobj 38 0 obj [/View/Design] endobj 39 0 obj <>>> endobj 36 0 obj [/View/Design] endobj 37 0 obj <>>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <>>> endobj 32 0 obj [/View/Design] endobj 33 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 26 0 obj <> endobj 24 0 obj [21 0 R 23 0 R 20 0 R 19 0 R 18 0 R 22 0 R] endobj 42 0 obj <> endobj xref +0 43 +0000000004 65535 f +0000000016 00000 n +0000000222 00000 n +0000021635 00000 n +0000000000 00000 f +0000021686 00000 n +0000000000 00000 f +0000000000 00000 f +0000024199 00000 n +0000024271 00000 n +0000024411 00000 n +0000026166 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000078339 00000 n +0000078409 00000 n +0000078485 00000 n +0000078640 00000 n +0000078269 00000 n +0000078561 00000 n +0000079528 00000 n +0000022099 00000 n +0000079415 00000 n +0000023934 00000 n +0000077694 00000 n +0000077742 00000 n +0000079299 00000 n +0000079330 00000 n +0000079183 00000 n +0000079214 00000 n +0000079067 00000 n +0000079098 00000 n +0000078951 00000 n +0000078982 00000 n +0000078835 00000 n +0000078866 00000 n +0000078719 00000 n +0000078750 00000 n +0000079588 00000 n +trailer +<<1046776A51C78D4A9AE8013BC44B2AAB>]>> +startxref +79789 +%%EOF diff --git a/src/components/design/content/ProduktUebersichtBedarfsausweisGewerbe.svelte b/src/components/design/content/ProduktUebersichtBedarfsausweisGewerbe.svelte index 99a133df..7da06032 100644 --- a/src/components/design/content/ProduktUebersichtBedarfsausweisGewerbe.svelte +++ b/src/components/design/content/ProduktUebersichtBedarfsausweisGewerbe.svelte @@ -26,7 +26,7 @@

-
+
Leistung
online
premium
offline
@@ -82,6 +82,6 @@ @apply text-[1.25rem] sm:text-[1.5rem] font-bold text-red-700; } - .price{@apply text-[1.15rem] sm:text-[1.5rem]} + .price{@apply text-[1.25rem] sm:text-[2rem]} \ No newline at end of file diff --git a/src/components/design/content/ProduktUebersichtBedarfsausweisWohnen.svelte b/src/components/design/content/ProduktUebersichtBedarfsausweisWohnen.svelte index 2208843e..e254e31e 100644 --- a/src/components/design/content/ProduktUebersichtBedarfsausweisWohnen.svelte +++ b/src/components/design/content/ProduktUebersichtBedarfsausweisWohnen.svelte @@ -26,7 +26,7 @@
-
+
Leistung
online
premium
offline
@@ -82,6 +82,6 @@ @apply text-[1.25rem] sm:text-[1.5rem] font-bold text-red-700; } - .price{@apply text-[1.15rem] sm:text-[1.5rem]} + .price{@apply text-[1.25rem] sm:text-[2rem]} \ No newline at end of file diff --git a/src/components/design/content/ProduktUebersichtVerbrauchsausweisGewerbe.svelte b/src/components/design/content/ProduktUebersichtVerbrauchsausweisGewerbe.svelte index be124698..f7f85af2 100644 --- a/src/components/design/content/ProduktUebersichtVerbrauchsausweisGewerbe.svelte +++ b/src/components/design/content/ProduktUebersichtVerbrauchsausweisGewerbe.svelte @@ -26,7 +26,7 @@
-
+
Leistung
online
premium
offline
@@ -82,6 +82,6 @@ @apply text-[1.25rem] sm:text-[1.5rem] font-bold text-red-700; } - .price{@apply text-[1.15rem] sm:text-[1.5rem]} + .price{@apply text-[1.25rem] sm:text-[2rem]} \ No newline at end of file diff --git a/src/components/design/content/ProduktUebersichtVerbrauchsausweisWohnen.svelte b/src/components/design/content/ProduktUebersichtVerbrauchsausweisWohnen.svelte index fd6a8a96..4bae90c3 100644 --- a/src/components/design/content/ProduktUebersichtVerbrauchsausweisWohnen.svelte +++ b/src/components/design/content/ProduktUebersichtVerbrauchsausweisWohnen.svelte @@ -26,7 +26,7 @@ bullets = [
-
+
Leistung
online
premium
offline
@@ -82,6 +82,6 @@ bullets = [ @apply text-[1.25rem] sm:text-[1.5rem] font-bold text-red-700; } -.price{@apply text-[1.15rem] sm:text-[1.5rem]} +.price{@apply text-[1.25rem] sm:text-[2rem]} \ No newline at end of file diff --git a/src/components/design/content/WidgetCardTemplate.svelte b/src/components/design/content/WidgetCardTemplate.svelte index 1eaff3b4..860548b3 100644 --- a/src/components/design/content/WidgetCardTemplate.svelte +++ b/src/components/design/content/WidgetCardTemplate.svelte @@ -31,9 +31,7 @@ />

- - ab {price} € - + ab {price} €

@@ -80,7 +78,7 @@ .sumCent{@apply justify-self-center col-span-2 md:mb-6} .sumRows{@apply hidden md:grid grid-rows-subgrid row-span-5} -.forServices{@apply w-full md:w-auto} +.forServices{@apply block} .image{@apply w-[75%] justify-self-center md:w-[75%] md:pl-12} @@ -88,11 +86,11 @@ .buttoncols{@apply grid grid-cols-1 gap-x-10 w-full md:grid-cols-2 md:w-[auto]} -.buttoncol{@apply mt-[0.5rem] text-center text-white bg-secondary rounded-md px-3 py-1 no-underline -hover:bg-primary} +.buttoncol{@apply mt-[0.5rem] text-center text-black bg-[#ffcc00] rounded-md px-3 py-1 no-underline +hover:bg-[#222222] hover:text-white} - .promo{@apply tracking-tighter text-[1.75rem] text-gray-700 pl-0 m-0 -mt-4; + .promo{@apply tracking-tighter text-[2rem] text-gray-700 pl-12 m-0 -mt-4; font-family: "Antique Olive Compact bold";} @@ -104,16 +102,16 @@ hover:bg-primary} } .services { - @apply hidden w-full text-start py-1 md:grid grid-cols-[1fr_minmax(25px,50px)] items-center; + @apply hidden w-full text-start py-1 md:grid md:grid-cols-[1fr_50px] } .services:not(:last-child) { @apply border-b-[1px] border-gray-200; } .check { - @apply justify-self-end font-bold text-green-700; + @apply justify-self-end self-center font-bold text-green-700; } .check-no { - @apply justify-self-end font-bold text-red-700; + @apply justify-self-end self-center font-bold text-red-700; } diff --git a/src/components/widgets/WelcherAusweisWidget_1.svelte b/src/components/widgets/WelcherAusweisWidget_1.svelte index dfe6edf1..cb754428 100644 --- a/src/components/widgets/WelcherAusweisWidget_1.svelte +++ b/src/components/widgets/WelcherAusweisWidget_1.svelte @@ -170,7 +170,7 @@ $: { {/if} - {#if twoBoxReason.includes(anlass) && gewerbeHouse.includes(gebaeudetyp) && (ausnahme === false)} + {#if twoBoxReason.includes(anlass) && gewerbeHouse.includes(gebaeudetyp)}
Date: Mon, 10 Feb 2025 09:47:32 +0700 Subject: [PATCH 06/11] Ansichtsausweis --- src/astro-typesafe-api-caller.ts | 2 +- src/components/AnsichtsausweisButton.svelte | 33 ++++++-- src/components/Ausweis/Ausweisart.svelte | 2 +- src/lib/XML/getEmpfehlungen.ts | 48 ++++++----- src/lib/pdf/pdfVerbrauchsausweisWohnen.ts | 84 ++++++++++++++++++- src/pages/dev/pdf-viewer.astro | 2 +- ...sichtsausweis.astro => ansichtsausweis.ts} | 77 +++++++++++------ 7 files changed, 186 insertions(+), 62 deletions(-) rename src/pages/pdf/{ansichtsausweis.astro => ansichtsausweis.ts} (53%) diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 7b0ed16d..4a683d52 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -5,8 +5,8 @@ export const createCaller = createCallerFactory({ "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), - "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), + "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), diff --git a/src/components/AnsichtsausweisButton.svelte b/src/components/AnsichtsausweisButton.svelte index df939d4b..a111aa9a 100644 --- a/src/components/AnsichtsausweisButton.svelte +++ b/src/components/AnsichtsausweisButton.svelte @@ -7,13 +7,34 @@ export let aufnahme: AufnahmeClient; export let bilder: UploadedGebaeudeBild[]; - $: base64Ausweis = Buffer.from(JSON.stringify(ausweis), "utf-8").toString("base64") - $: base64Aufnahme = Buffer.from(JSON.stringify(aufnahme), "utf-8").toString("base64") - $: base64Objekt = Buffer.from(JSON.stringify(objekt), "utf-8").toString("base64") - $: base64Bilder = Buffer.from(JSON.stringify(bilder), "utf-8").toString("base64") + function openWindowWithPost(url: string, data: Record) { + var form = document.createElement("form"); + form.target = "_blank"; + form.method = "POST"; + form.action = url; + form.style.display = "none"; + + for (var key in data) { + var input = document.createElement("input"); + input.type = "hidden"; + input.name = key; + input.value = data[key]; + form.appendChild(input); + } + document.body.appendChild(form); + form.submit(); + document.body.removeChild(form); +} - + diff --git a/src/components/Ausweis/Ausweisart.svelte b/src/components/Ausweis/Ausweisart.svelte index 25092d90..986be682 100644 --- a/src/components/Ausweis/Ausweisart.svelte +++ b/src/components/Ausweis/Ausweisart.svelte @@ -70,7 +70,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 required bind:value={aufnahme.gebaeudetyp} > - + {#if ausweisart=="VerbrauchsausweisWohnen"} diff --git a/src/lib/XML/getEmpfehlungen.ts b/src/lib/XML/getEmpfehlungen.ts index 658b2f91..5bb3e34b 100644 --- a/src/lib/XML/getEmpfehlungen.ts +++ b/src/lib/XML/getEmpfehlungen.ts @@ -1,34 +1,36 @@ -import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; +import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { Enums } from "@ibcornelsen/database/client"; import moment from "moment"; -export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient): { +export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient): { title: string, description: string, - anlagenteil: string + anlagenteil: string, + amortisationszeit: string, + kosten: string }[] { - let Warmwasserrohre_gedaemmt = ausweis.aufnahme.warmwasser_rohre_gedaemmt; - let Heizungsrohre_gedaemmt = ausweis.aufnahme.heizungsrohre_gedaemmt; - let Waermepumpe = ausweis.aufnahme.waermepumpe; - let Kellerwand_gedaemmt = ausweis.aufnahme.keller_wand_gedaemmt; - let Keller = ausweis.aufnahme.keller; - let Kellerdecke_Kalraeume_gedaemmt = ausweis.aufnahme.keller_decke_gedaemmt; - let Brennwertkessel = ausweis.aufnahme.brennwert_kessel; - let baujahr_anlagesanlage = ausweis.aufnahme.baujahr_heizung[0]; - let Zentralheizung = ausweis.aufnahme.zentralheizung; - let photovoltaik = ausweis.aufnahme.photovoltaik; - let Brennstoff = ausweis.aufnahme.brennstoff_1; - let Aussenwand_gedaemmt = ausweis.aufnahme.aussenwand_gedaemmt; - let Dachgeschoss = ausweis.aufnahme.dachgeschoss; - let Dachgeschoss_gedaemmt = ausweis.aufnahme.dachgeschoss_gedaemmt; - let Oberste_Geschossdecke_gedaemmt = ausweis.aufnahme.oberste_geschossdecke_gedaemmt; - let Einfachglas = ausweis.aufnahme.einfach_verglasung; - let Doppelfenster = ausweis.aufnahme.doppel_verglasung; - let Fenster_teilw_undicht = ausweis.aufnahme.fenster_teilweise_undicht; + let Warmwasserrohre_gedaemmt = aufnahme.warmwasser_rohre_gedaemmt; + let Heizungsrohre_gedaemmt = aufnahme.heizungsrohre_gedaemmt; + let Waermepumpe = aufnahme.waermepumpe; + let Kellerwand_gedaemmt = aufnahme.keller_wand_gedaemmt; + let Keller = aufnahme.keller; + let Kellerdecke_Kalraeume_gedaemmt = aufnahme.keller_decke_gedaemmt; + let Brennwertkessel = aufnahme.brennwert_kessel; + let baujahr_anlagesanlage = aufnahme.baujahr_heizung[0]; + let Zentralheizung = aufnahme.zentralheizung; + let photovoltaik = aufnahme.photovoltaik; + let Brennstoff = aufnahme.brennstoff_1; + let Aussenwand_gedaemmt = aufnahme.aussenwand_gedaemmt; + let Dachgeschoss = aufnahme.dachgeschoss; + let Dachgeschoss_gedaemmt = aufnahme.dachgeschoss_gedaemmt; + let Oberste_Geschossdecke_gedaemmt = aufnahme.oberste_geschossdecke_gedaemmt; + let Einfachglas = aufnahme.einfach_verglasung; + let Doppelfenster = aufnahme.doppel_verglasung; + let Fenster_teilw_undicht = aufnahme.fenster_teilweise_undicht; let empfehlungen = []; - if (ausweis.aufnahme.einfach_verglasung || (Doppelfenster && Fenster_teilw_undicht)) { + if (aufnahme.einfach_verglasung || (Doppelfenster && Fenster_teilw_undicht)) { empfehlungen.push({ "title" : "Erneuerung der Fenster", "description" : "Alte und undichte Fenster mit Wärmeschutzfenstern auswechseln.", @@ -38,7 +40,7 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient): { }); } - if (ausweis.aufnahme.dachgeschoss == Enums.Heizungsstatus.UNBEHEIZT && !Oberste_Geschossdecke_gedaemmt) { + if (aufnahme.dachgeschoss == Enums.Heizungsstatus.UNBEHEIZT && !Oberste_Geschossdecke_gedaemmt) { empfehlungen.push({ "title" : "Zusätzliche Dämmung des Fußbodens des kalten Dachraumes", "description" : "Beim Einbringen sollten mindestens 16cm Dämmstoff verarbeitet werden. Das Einsparpotenzial ist für jeden zusätzlichen cm Dämmung sehr hoch.", diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index bf42987a..5b7d8240 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -1,9 +1,10 @@ import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; +import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js"; import { Enums } from "@ibcornelsen/database/server"; import * as fs from "fs" import moment from "moment"; -import { PDFDocument, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib"; +import { PDFDocument, PDFFont, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -15,6 +16,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne // const template = VerbrauchsausweisWohnen2016Template as Template; const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) const height = pages[0].getHeight() @@ -41,12 +43,12 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne } } - const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp) + const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "") const adresse = fillFormField("adresse", objekt.adresse) - const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil) + const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "") const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude?.toString()) @@ -291,6 +293,82 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne ).toString(), berechnungen?.klimafaktoren[0].klimafaktor.toString() ); + + /* -------------------------------- Seite 4 -------------------------------- */ + + const splitToSize = (text: string, size: number, font: PDFFont, fontSize: number) => { + const lines = [] + + let currentLine = "" + for (const char of text) { + if (font.widthOfTextAtSize(currentLine + char, fontSize) <= size) { + currentLine += char; + } else { + lines.push(currentLine) + currentLine = char; + } + } + + lines.push(currentLine) + + return lines.join("\n") + } + + const addEmpfehlungenGenerator = () => { + let i = 0; + let yOffset = 43; + const initialHeight = 568 + const initialXOffset = 36; + return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => { + pages[3].drawText((i + 1).toString(), { + x: initialXOffset, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[3].drawText(splitToSize(bauteil || "", 70, font, 8), { + x: initialXOffset + 25, + y: initialHeight - (i * yOffset), + size: 8, + font, + lineHeight: 10 + }) + + pages[3].drawText(splitToSize(beschreibung || "", 230, font, 8), { + x: initialXOffset + 98, + y: initialHeight - (i * yOffset), + size: 8, + font, + lineHeight: 10 + }) + + + + pages[3].drawText(amortisationszeit || "", { + x: initialXOffset + 403, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[3].drawText(kosten || "", { + x: initialXOffset + 451, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + i++; + } + } + + const addEmpfehlung = addEmpfehlungenGenerator() + + for (const empfehlung of empfehlungen) { + addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten) + } + + // pdf.getForm().flatten() diff --git a/src/pages/dev/pdf-viewer.astro b/src/pages/dev/pdf-viewer.astro index aa439e6e..1ba3ba6e 100644 --- a/src/pages/dev/pdf-viewer.astro +++ b/src/pages/dev/pdf-viewer.astro @@ -5,5 +5,5 @@ import BlankLayout from "#layouts/BlankLayout.astro"; --- - + \ No newline at end of file diff --git a/src/pages/pdf/ansichtsausweis.astro b/src/pages/pdf/ansichtsausweis.ts similarity index 53% rename from src/pages/pdf/ansichtsausweis.astro rename to src/pages/pdf/ansichtsausweis.ts index 979c016b..dc5cdc7e 100644 --- a/src/pages/pdf/ansichtsausweis.astro +++ b/src/pages/pdf/ansichtsausweis.ts @@ -1,35 +1,27 @@ ---- import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; -import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; -import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen"; +import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; +import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js"; import { Enums } from "@ibcornelsen/database/client"; -import { createCaller } from "src/astro-typesafe-api-caller"; +import { APIRoute } from "astro"; +import { createCaller } from "src/astro-typesafe-api-caller.js"; -const base64Ausweis = Astro.url.searchParams.get("ausweis"); -const base64Aufnahme = Astro.url.searchParams.get("aufnahme"); -const base64Objekt = Astro.url.searchParams.get("objekt"); -const base64Bilder = Astro.url.searchParams.get("bilder"); -let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null; -let aufnahme: AufnahmeClient = {} as AufnahmeClient; -let objekt: ObjektClient = {} as ObjektClient; -let user: BenutzerClient = {} as BenutzerClient; -let bilder: UploadedGebaeudeBild[] = [] -if (base64Ausweis && base64Aufnahme && base64Objekt && base64Bilder) { - ausweis = JSON.parse(Buffer.from(base64Ausweis, "base64").toString("utf-8")) as VerbrauchsausweisWohnenClient; - objekt = JSON.parse(Buffer.from(base64Objekt, "base64").toString("utf-8")) as ObjektClient; - aufnahme = JSON.parse(Buffer.from(base64Aufnahme, "base64").toString("utf-8")) as AufnahmeClient; - bilder = JSON.parse(Buffer.from(base64Bilder, "base64").toString("utf-8")) as UploadedGebaeudeBild[]; -} else { +export const GET: APIRoute = async (Astro) => { const uidAusweis = Astro.url.searchParams.get("uid"); if (!uidAusweis) { - return Astro.redirect("/404"); + return Astro.redirect("/404") } const ausweisart = getAusweisartFromUUID(uidAusweis) const caller = createCaller(Astro); + let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null; + let aufnahme: AufnahmeClient = {} as AufnahmeClient; + let objekt: ObjektClient = {} as ObjektClient; + let user: BenutzerClient = {} as BenutzerClient; + let bilder: UploadedGebaeudeBild[] = [] + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, { params: { @@ -78,13 +70,44 @@ if (base64Ausweis && base64Aufnahme && base64Objekt && base64Bilder) { Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` } }); + + const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + + return new Response(pdf, { + headers: { + "Content-Type": "application/pdf", + }, + }); } -const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); +export const POST: APIRoute = async (Astro) => { + const body = await Astro.request.text(); + const params = new URLSearchParams(body); -return new Response(pdf, { - headers: { - "Content-Type": "application/pdf", - }, -}); ---- + const caller = createCaller(Astro); + + const ausweis = JSON.parse(params.get("ausweis")); + const aufnahme = JSON.parse(params.get("aufnahme")); + const objekt = JSON.parse(params.get("objekt")); + const bilder = JSON.parse(params.get("bilder")); + + let user: BenutzerClient = {}; + + try { + user = await caller.user.self.GET.fetch(undefined, { + headers: { + Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` + } + }); + } catch (e) { + + } + + const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + + return new Response(pdf, { + headers: { + "Content-Type": "application/pdf", + }, + }); +} \ No newline at end of file From c7b1bc7958ddc65cf57dd19d88c52106f4ce5e9d Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Mon, 10 Feb 2025 16:20:55 +0700 Subject: [PATCH 07/11] Ausweis Verbrauchsausweis Gewerbe + Skala + Berechnung --- .../skala-verbrauchsausweis-gewerbe.png | Bin 0 -> 19816 bytes ...png => skala-verbrauchsausweis-wohnen.png} | Bin src/astro-typesafe-api-caller.ts | 4 +- src/components/AnsichtsausweisButton.svelte | 5 +- .../Ausweis/AusweisPreviewContainer.svelte | 5 +- .../Ausweis/PerformanceScore.svelte | 23 +- .../VerbrauchsausweisGewerbe_2016.ts | 281 +++++++++++++ .../bauwerkskatalog.json | 54 +++ src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts | 374 +++++++++++++++++- .../pdf/templates/GEG24_Nichtwohngebaeude.pdf | Bin 0 -> 53757 bytes .../BedarfsausweisWohnenModule.svelte | 1 + .../VerbrauchsausweisGewerbeModule.svelte | 36 +- .../VerbrauchsausweisWohnenModule.svelte | 2 + src/pages/pdf/ansichtsausweis.ts | 18 +- 14 files changed, 789 insertions(+), 14 deletions(-) create mode 100644 public/images/formular/skala-verbrauchsausweis-gewerbe.png rename public/images/formular/{SKALA-910.png => skala-verbrauchsausweis-wohnen.png} (100%) create mode 100644 src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts create mode 100644 src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json create mode 100644 src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf diff --git a/public/images/formular/skala-verbrauchsausweis-gewerbe.png b/public/images/formular/skala-verbrauchsausweis-gewerbe.png new file mode 100644 index 0000000000000000000000000000000000000000..686e54f8c976623fbff7ae868707861956d738a9 GIT binary patch literal 19816 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 HUH;`?*fpl! literal 0 HcmV?d00001 diff --git a/public/images/formular/SKALA-910.png b/public/images/formular/skala-verbrauchsausweis-wohnen.png similarity index 100% rename from public/images/formular/SKALA-910.png rename to public/images/formular/skala-verbrauchsausweis-wohnen.png diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 6cc46fc7..81eb88cc 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -8,8 +8,8 @@ export const createCaller = createCallerFactory({ "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), - "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), + "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "objekt": await import("../src/pages/api/objekt/index.ts"), "rechnung": await import("../src/pages/api/rechnung/index.ts"), "ticket": await import("../src/pages/api/ticket/index.ts"), @@ -17,9 +17,9 @@ export const createCaller = createCallerFactory({ "user/self": await import("../src/pages/api/user/self.ts"), "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), - "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), + "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"), "objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"), }) \ No newline at end of file diff --git a/src/components/AnsichtsausweisButton.svelte b/src/components/AnsichtsausweisButton.svelte index a111aa9a..831c8dc7 100644 --- a/src/components/AnsichtsausweisButton.svelte +++ b/src/components/AnsichtsausweisButton.svelte @@ -1,11 +1,13 @@
@@ -60,8 +61,8 @@
- - + +
diff --git a/src/components/Ausweis/PerformanceScore.svelte b/src/components/Ausweis/PerformanceScore.svelte index 164d236a..8487f6c3 100644 --- a/src/components/Ausweis/PerformanceScore.svelte +++ b/src/components/Ausweis/PerformanceScore.svelte @@ -9,12 +9,20 @@ VerbrauchsausweisWohnenClient, } from "./types.js"; import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; + import { Enums } from "@ibcornelsen/database/client"; + import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let aufnahme: AufnahmeClient; export let objekt: ObjektClient; + export let ausweisart: Enums.Ausweisart; - let maxPerformance = 250; + let maxPerformance = { + [Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000, + [Enums.Ausweisart.VerbrauchsausweisWohnen]: 250, + [Enums.Ausweisart.BedarfsausweisWohnen]: 250, + [Enums.Ausweisart.BedarfsausweisGewerbe]: 250 + }[ausweisart]; /** * We use linear interpolation to scale the value between the given boundaries. @@ -54,7 +62,12 @@ let translation_2 = 0; $: { (async () => { - const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + let result; + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + } if (!result) { return; @@ -71,7 +84,11 @@ }
- Energieeffizienz Skala + {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen} + Energieeffizienz Skala + {:else if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe} + Energieeffizienz Skala + {/if} 500 && aufnahme.nutzflaeche <= 50000) { + faktorHeizung = 4.53 * (aufnahme.nutzflaeche ** -0.215) + 0.27; + } else { + faktorHeizung = 0.71; + } + + let tekHeizung = tekWerte[0] * faktorHeizung; + let tekWarmwasser = tekWerte[1] * faktorWarmwasser; + let tekLueftung = ausweis.stromverbrauch_enthaelt_lueftung ? tekWerte[2] : 0; + + let tekEingebauteBeleuchtung = ausweis.stromverbrauch_enthaelt_beleuchtung ? tekWerte[3] : 0; + let tekKaelte = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[4] : 0; + + let tekHilfsenergieKuehlung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[5] : 0; + let tekBeEntfeuchtung = ausweis.stromverbrauch_enthaelt_kuehlung ? tekWerte[6] : 0; + + // TODO: let tekAufzug = ausweis.nwaufzug ? 2 : 0; + let tekAufzug = 0; + + let tekSonstiges = (ausweis.stromverbrauch_enthaelt_sonstige != null && ausweis.stromverbrauch_enthaelt_sonstige.length > 0) ? tekWerte[7] : 0; + + let vergleichsWertWaerme = tekHeizung + tekKaelte + tekBeEntfeuchtung; + let vergleichsWertStrom = tekWarmwasser + tekLueftung + tekEingebauteBeleuchtung + tekHilfsenergieKuehlung + tekAufzug + tekSonstiges; + + return [vergleichsWertWaerme, vergleichsWertStrom]; +} + +/** + * Gibt einen array bestehend aus + * [0]: Endenergieverbrauch + * [1]: Primärenergiebedarf + * zurück. + * + * @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll + * @return VerbrauchsausweisGewerbeCalculationResult + */ +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) { + if (!aufnahme || !objekt || !ausweis) { + return null; + } + + const nutzflaeche = aufnahme.nutzflaeche || 0; + + let startdatum = moment(ausweis.startdatum); + + let klimafaktoren: Awaited> = [{ + month: startdatum.month(), + year: startdatum.year(), + klimafaktor: 1 + }, + { + month: startdatum.month(), + year: startdatum.year() + 1, + klimafaktor: 1 + }, + { + month: startdatum.month(), + year: startdatum.year() + 2, + klimafaktor: 1 + }]; + + try { + const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz) + + if (response) { + klimafaktoren = response + } + } catch (e) { + // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück. + // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung. + // return null + } + + // Endenergieverbrauch + // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. + let umrechnungsfaktor = 1, primaerfaktor = 1, coe = 1; + let umrechnungsfaktor_1 = 1, primaerfaktor_1 = 1, coe_1 = 1; + if (ausweis.brennstoff_1 && ausweis.einheit_1) { + let result = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1); + umrechnungsfaktor = result.umrechnungsfaktor + primaerfaktor = result.primaerenergiefaktor + coe = result.coe + } + + if (ausweis.brennstoff_2 && ausweis.einheit_2) { + let result = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2); + umrechnungsfaktor_1 = result.umrechnungsfaktor + primaerfaktor_1 = result.primaerenergiefaktor + coe_1 = result.coe + } + + let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * umrechnungsfaktor; + let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * umrechnungsfaktor_1; + + let energieVerbrauchWarmwasser_1 = 0; + let energieVerbrauchWarmwasser_2 = 0; + + if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0) { + + // Wenn Warmwasser enthalten und Anteil bekannt + energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100); + energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); + + } else if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 == 0){ + 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_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); + + } else { + energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.05; + energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100); + + } + } else + { + energieVerbrauchWarmwasser_1 = 0; + energieVerbrauchWarmwasser_2 = 0; + } + + let kuehlungsZuschlag_1: number; + let kuehlungsZuschlag_2: number; + if (ausweis.wird_gekuehlt) { + kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100); + kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100); + } else { + kuehlungsZuschlag_1 = kuehlungsZuschlag_2 = 0; + } + + // Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden. + let leerstand = (aufnahme.leerstand || 0) / 100; + + let energieVerbrauchHeizung_1 = energieVerbrauchGesamt_1 - energieVerbrauchWarmwasser_1 - kuehlungsZuschlag_1; + let energieVerbrauchHeizung_2 = energieVerbrauchGesamt_2 - energieVerbrauchWarmwasser_2 - kuehlungsZuschlag_2; + + let durchschnittsKlimafaktor = klimafaktoren.reduce((acc, c) => acc + c.klimafaktor, 0) / klimafaktoren.length; + + let energieVerbrauchHeizungBereinigt_1 = energieVerbrauchHeizung_1 * durchschnittsKlimafaktor; + let energieVerbrauchHeizungBereinigt_2 = energieVerbrauchHeizung_2 * durchschnittsKlimafaktor; + + let durchschnittsEnergieVerbrauchHeizungBereingt = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2) / (3 * nutzflaeche); + + let faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = -0.0028 * durchschnittsEnergieVerbrauchHeizungBereingt + 0.9147; + + if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt <= 0.25) { + faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 0.25; + } else if (faktorDurchschnittsEnergieVerbrauchHeizungBereinigt >= 1.0) { + faktorDurchschnittsEnergieVerbrauchHeizungBereinigt = 1.0; + } + + let leerstandsZuschlagHeizung = faktorDurchschnittsEnergieVerbrauchHeizungBereinigt * leerstand * (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchHeizungBereinigt_2); + let leerstandsZuschlagWarmwasser = leerstand * (energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2); + let leerstandsZuschlagKuehlung = leerstand * (kuehlungsZuschlag_1 + kuehlungsZuschlag_2); + + + let endEnergieVerbrauch_1 = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1 + kuehlungsZuschlag_1) / (3 * nutzflaeche); + let endEnergieVerbrauch_2 = (energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2 + kuehlungsZuschlag_2) / (3 * nutzflaeche); + + let energieVerbrauchStrom = ausweis.strom_1 + ausweis.strom_2 + ausweis.strom_3; + let leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom; + + let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche); + let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8; + + let co2EmissionenStrom = endEnergieVerbrauchStrom * 0.560; + + let endEnergieVerbrauchLeerstandsZuschlag = (leerstandsZuschlagHeizung + leerstandsZuschlagWarmwasser + leerstandsZuschlagKuehlung) / (3 * nutzflaeche); + let endEnergieVerbrauchKuehlungsZuschlag_1 = kuehlungsZuschlag_1 / (3 * nutzflaeche); + let endEnergieVerbrauchKuehlungsZuschlag_2 = kuehlungsZuschlag_2 / (3 * nutzflaeche); + + let primaerEnergieVerbrauch_1 = endEnergieVerbrauch_1 * primaerfaktor; + let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * primaerfaktor_1; + + let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * primaerfaktor; + let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * primaerfaktor; + let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * primaerfaktor_1; + + let co2Emissionen_1 = endEnergieVerbrauch_1 * coe; + let co2Emissionen_2 = endEnergieVerbrauch_2 * coe_1; + + let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * coe; + let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * coe; + let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * coe_1; + + let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag; + let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom; + let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom; + + let [vergleichsWertWaerme, vergleichsWertStrom] = vergleichsWertNichtWohngebaeude(ausweis, aufnahme); + + // Return all the steps that this function includes for debugging as a json object + return { + umrechnungsfaktor : umrechnungsfaktor, + primaerfaktor : primaerfaktor, + coe : coe, + umrechnungsfaktor_1 : umrechnungsfaktor_1, + primaerfaktor_1 : primaerfaktor_1, + coe_1 : coe_1, + kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1), + kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2), + durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor,2), + Klimafaktor_1 : klimafaktoren[0], + Klimafaktor_2 : klimafaktoren[1], + Klimafaktor_3 : klimafaktoren[2], + anteil_heizung_1: 1 - ((ausweis.anteil_warmwasser_1 || 0) / 100), + anteil_heizung_2: 1 - ((ausweis.anteil_warmwasser_2 || 0) / 100), + verbrauch_1_kwh: ausweis.verbrauch_1 * umrechnungsfaktor, + verbrauch_2_kwh: ausweis.verbrauch_2 * umrechnungsfaktor, + verbrauch_3_kwh: ausweis.verbrauch_3 * umrechnungsfaktor, + verbrauch_4_kwh: ausweis.verbrauch_4 * umrechnungsfaktor_1, + verbrauch_5_kwh: ausweis.verbrauch_5 * umrechnungsfaktor_1, + verbrauch_6_kwh: ausweis.verbrauch_6 * umrechnungsfaktor_1, + klimafaktoren : klimafaktoren, + nutzflaeche : Math.round(nutzflaeche), + leerstand : leerstand, + leerstandsZuschlagHeizung: Math.round(leerstandsZuschlagHeizung), + leerstandsZuschlagWarmwasser: Math.round(leerstandsZuschlagWarmwasser), + leerstandsZuschlagKuehlung: Math.round(leerstandsZuschlagKuehlung), + endEnergieVerbrauchLeerstandsZuschlag: Math.round(endEnergieVerbrauchLeerstandsZuschlag), + endEnergieVerbrauchKuehlungsZuschlag_1: Math.round(endEnergieVerbrauchKuehlungsZuschlag_1), + endEnergieVerbrauchKuehlungsZuschlag_2: Math.round(endEnergieVerbrauchKuehlungsZuschlag_2), + coeeffkg : co2EmissionenGesamt, + energieVerbrauchGesamt_1: Math.round(energieVerbrauchGesamt_1), + energieVerbrauchGesamt_2: Math.round(energieVerbrauchGesamt_2), + energieVerbrauchWarmwasser_1: Math.round(energieVerbrauchWarmwasser_1), + energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2), + energieVerbrauchHeizung_1: energieVerbrauchHeizung_1, + energieVerbrauchHeizung_2: energieVerbrauchHeizung_2, + anteil_warmwasser_1: ausweis.anteil_warmwasser_1 / 100, + anteil_warmwasser_2: ausweis.anteil_warmwasser_2 / 100, + energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1), + energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2), + durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt), + faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt,3), + endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1), + endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2), + energieVerbrauchStrom: energieVerbrauchStrom, + leerstandsZuschlagStrom: leerstandsZuschlagStrom, + endEnergieVerbrauchStrom: Math.round(endEnergieVerbrauchStrom), + primaerEnergieVerbrauchStrom: Math.round(primaerEnergieVerbrauchStrom), + primaerEnergieVerbrauch_1: Math.round(primaerEnergieVerbrauch_1), + primaerEnergieVerbrauch_2: Math.round(primaerEnergieVerbrauch_2), + primaerEnergieVerbrauchLeerstandsZuschlag: Math.round(primaerEnergieVerbrauchLeerstandsZuschlag), + primaerEnergieVerbrauchKuehlungsZuschlag_1: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_1), + primaerEnergieVerbrauchKuehlungsZuschlag_2: Math.round(primaerEnergieVerbrauchKuehlungsZuschlag_2), + co2Emissionen_1: co2Emissionen_1, + co2Emissionen_2: co2Emissionen_2, + co2EmissionenLeerstandsZuschlag: co2EmissionenLeerstandsZuschlag, + co2EmissionenKuehlungsZuschlag_1: co2EmissionenKuehlungsZuschlag_1, + co2EmissionenKuehlungsZuschlag_2: co2EmissionenKuehlungsZuschlag_2, + co2EmissionenGesamt: Math.round(co2EmissionenGesamt), + endEnergieVerbrauchGesamt: Math.round(endEnergieVerbrauchGesamt), + primaerEnergieVerbrauchGesamt: Math.round(primaerEnergieVerbrauchGesamt), + vergleichsWertWaerme: vergleichsWertWaerme, + vergleichsWertStrom: vergleichsWertStrom, + } +} \ No newline at end of file diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json new file mode 100644 index 00000000..18fff39d --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/bauwerkskatalog.json @@ -0,0 +1,54 @@ +{ + "Verwaltungsgebäude (allgemein)": [48.5, 6.9, 3.2, 10.7, 2.6, 3.1, 0.1, 2.8], + "Parlaments- und Gerichtsgebäude": [49.9, 6.8, 3, 9.5, 1.2, 0.9, 1.7, 0.6], + "Ministerien u. Ämter u. Behörden": [48.3, 7.4, 3.7, 10.8, 1.5, 1.2, 1, 0.7], + "Polizeidienstgebäude": [52.4, 7.4, 2.5, 10.4, 0.5, 0.4, 0, 0.7], + "Gebäude für öffentliche Bereitschaftsdienste": [51.6, 10.2, 3, 7.8, 0.3, 0.2, 0, 4], + "Feuerwehrdienstgebäude": [50.8, 7.1, 3.2, 6.7, 0.3, 0.2, 0, 3.7], + "Bürogebäude": [49, 8.1, 4.7, 12.9, 2.9, 2.2, 0, 2.8], + "Bürogebäude - überwiegend Großraumbüros": [47.4, 12.8, 7.3, 16.6, 6, 4.3, 0, 0.9], + "Bankgebäude": [48, 6.4, 1.6, 10.7, 1.5, 1.1, 0, 0.6], + "Hochschule und Forschung (allgemein)": [66.5, 6.7, 13.3, 11, 3.4, 2.2, 3.8, 1.2], + "Gebäude für Lehre": [57.2, 5.6, 8.7, 8.5, 2.5, 1.5, 0.4, 1.1], + "Institute für Lehre und Forschung": [65, 7.6, 13.8, 11.7, 3.5, 2.4, 14.7, 2.1], + "Gebäude für Forschung ohne Lehre": [87.8, 7.4, 14.9, 14.8, 3.5, 2.4, 0, 1.2], + "Laborgebäude": [82.8, 8, 20.3, 13.5, 4.2, 2.9, 1.7, 1.3], + "Gesundheitswesen (allgemein)": [55.7, 15.3, 4.9, 17.4, 1.6, 1.3, 0, 1.1], + "Krankenhäuser (ohne Forschung und Lehre)": [64.1, 40.8, 10.4, 15.8, 1.7, 1.6, 0, 1.2], + "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung": [61.7, 33.6, 9.2, 15.9, 1.7, 1.6, 0, 0.9], + "Medizinische Einrichtungen für nicht stationäre Versorgung": [51.2, 8.6, 2.2, 18.3, 1.4, 1, 0, 1.3], + "Gebäude für Reha": [null, 59.4, 22.1, 6, 14.6, 0.9, 0.7, 0, 3.5], + "Bildungseinrichtungen (allgemein)": [49.7, 19.5, 4.1, 5.5, 0.2, 0.2, 0, 0.6], + "Schulen": [49.3, 22.4, 3.9, 5.5, 0.3, 0.2, 0, 0.6], + "Kinderbetreuungseinrichtungen": [50.4, 17.3, 4.2, 5.5, 0.1, 0.1, 0, 0.6], + "Kultureinrichtungen (allgemein)": [55.9, 7.5, 6.7, 9, 1.6, 1.2, 0.1, 0.3], + "Bibliotheken/Archive": [49, 5, 2.1, 14.3, 0.5, 0.4, 0, 0.3], + "Ausstellungsgebäude": [57.6, 7.7, 6.3, 7.8, 1.7, 1.3, 0.3, 0.2], + "Veranstaltungsgebäude": [58.4, 9.1, 7, 8.9, 1.3, 0.9, 0.1, 0.3], + "Gemeinschafts-/Gemeindehäuser": [63.6, 10, 5.6, 10.8, 0.8, 0.6, 0.1, 6], + "Opern/Theater": [58.8, 7.6, 9.1, 8.6, 2, 1.3, 0, 0.9], + "Sporteinrichtungen (allgemein)": [65.5, 27.3, 6.4, 14.5, 0.6, 0.6, 0, 1.9], + "Sporthallen": [68.6, 22, 4.6, 14.3, 0.2, 0.2, 0, 0.1], + "Fitnessstudios": [60.6, 62.2, 11.9, 24.5, 4, 4.2, 0, 8.9], + "Schwimmhallen": [63.8, 24.7, 8.3, 13.4, 1.1, 1.1, 30, 7.3], + "Gebäude für Sportaußenanlagen": [75.2, 22.5, 5.7, 10.2, 0, 0, 0, 5.5], + "Verpflegungseinrichtungen (allgemein)": [75.9, 77.7, 16.6, 18.1, 3.5, 3, 0, 24.8], + "Beherbergungsstätten (allgemein)": [52.1, 86, 9.1, 9.1, 3.3, 2.7, 0, 7], + "Hotels/Pensionen": [51.2, 89.1, 9.1, 8.6, 3.5, 2.9, 0, 6.8], + "Jugendherbergen u. Ferienhäuser": [63.4, 50.9, 1.9, 12.6, 0, 0, 0, 8.8], + "Gaststätten": [77.8, 79, 13.7, 19.7, 3.8, 3.3, 0, 25.2], + "Mensen u. Kantinen": [67, 67.3, 21, 11.4, 0.7, 0.5, 0, 22.7], + "Gewerbliche und industrielle Gebäude (allgemein)": [38.7, 12.6, 2.1, 9.6, 0.8, 0.5, 0, 12.2], + "Gewerbliche und industrielle Gebäude - schwere Arbeit": [null, 37.8, 20, 3.1, 11.8, 1, 0.6, 0, 22.6], + "Gewerbliche und industrielle Gebäude - Mischung aus leichter u. schwerer Arbeit": [36, 24.2, 3.8, 13, 2.1, 1.2, 0, 24.9], + "Gewerbliche und industrielle Gebäude - leichte Arbeit": [null, 38.1, 19.8, 3.3, 15.2, 1.9, 1.1, 0, 22.3], + "Gebäude für Lagerung": [38.1, 19.3, 3.3, 13.2, 1.7, 1, 0, 21.6], + "Verkaufsstätten (allgemein)": [47.9, 7.6, 5.6, 16.3, 2.6, 2, 0, 6.9], + "Kaufhäuser": [45.9, 6.4, 6, 16.6, 1.1, 0.9, 0, 2.7], + "Kaufhauszentren/Einkaufszentren": [47.3, 11.1, 7.4, 16.6, 4.6, 3.5, 0.1, 5.5], + "Märkte": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 10.5], + "Märkte mit sehr hohem Anteil von Kühlung für Lebensmittel": [48.7, 6.2, 7.3, 17.3, 2.8, 2.1, 0, 72.5], + "Läden": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 2.1], + "Läden mit sehr hohem Anteil von Kühlung für Lebensmittel": [46.8, 6.4, 1.9, 15.8, 0.9, 0.7, 0, 54.1], + "Fernmeldetechnik": [38.4, 4, 3.4, 16, 0, 0, 0, 53.7] +} \ No newline at end of file diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index 241733c9..bd8f6f6a 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -1,5 +1,375 @@ -import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; +import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; +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, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib"; -export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) { +export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) { + const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64"); + const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) + const pages = pdf.getPages() + + // const template = VerbrauchsausweisWohnen2016Template as Template; + + const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + console.log(berechnungen); + + const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) + + const height = pages[0].getHeight() + + const font = await pdf.embedFont(StandardFonts.Helvetica) + const bold = await pdf.embedFont(StandardFonts.HelveticaBold) + + const form = pdf.getForm() + form.updateFieldAppearances(font) + + const fillFormField = (name: string, value: string, fontSize: number = 8, alignment: TextAlignment = TextAlignment.Left) => { + const field = form.getTextField(name) + field.setFontSize(fontSize) + field.setText(value) + field.setAlignment(alignment) + } + + const toggleCheck = (name: string, checked: boolean = true) => { + const field = form.getCheckBox(name) + + if (checked) { + field.check() + } else { + field.uncheck() + } + } + + // 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 === "Gebaeude"); + + + // /* -------------------------------- Seite 2 -------------------------------- */ + + // const co2Emissionen = fillFormField("co2emissionen", berechnungen?.co2EmissionenGesamt.toString(), 8, TextAlignment.Center) + + 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 minTranslation = 120 + const maxTranslation = 457 + const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage; + const primaerenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * primaerenergieverbrauchTranslationPercentage; + + const pfeilWidth = 20 + const margin = 5; + + page.drawImage(pfeilNachUnten, { + x: endenergieverbrauchTranslationX, + y: height - 215, + width: pfeilWidth, + height: 30 + }) + + const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; + const primaerEnergieVerbrauchGesamtText = `${berechnungen?.primaerEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; + + if (endenergieverbrauchTranslationPercentage > 0.5) { + page.drawText("Endenergieverbrauch", { + x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10), + y: height - 193, + size: 10 + }) + + page.drawText(endEnergieVerbrauchGesamtText, { + x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10), + y: height - 207, + size: 10, + font: bold + }) + } else { + page.drawText("Endenergieverbrauch", { + x: endenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 193, + size: 10 + }) + page.drawText(endEnergieVerbrauchGesamtText, { + x: endenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 207, + size: 10, + font: bold + }) + } + + page.drawImage(pfeilNachOben, { + x: primaerenergieverbrauchTranslationX, + y: height - 298, + width: pfeilWidth, + height: 30 + }) + + if (endenergieverbrauchTranslationPercentage > 0.5) { + page.drawText("Primärenergieverbrauch", { + x: primaerenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10), + y: height - 280, + size: 10 + }) + + page.drawText(primaerEnergieVerbrauchGesamtText, { + x: primaerenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(primaerEnergieVerbrauchGesamtText, 10), + y: height - 294, + size: 10, + font: bold + }) + } else { + page.drawText("Primärenergieverbrauch", { + x: primaerenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 280, + size: 10 + }) + page.drawText(primaerEnergieVerbrauchGesamtText, { + x: primaerenergieverbrauchTranslationX + pfeilWidth + margin, + y: height - 294, + size: 10, + font: bold + }) + } + } + + addEnergieverbrauchSkalaPfeile(pages[1]) + addEnergieverbrauchSkalaPfeile(pages[2]) + + // const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString()) + + + /* -------------------------------- Seite 3 -------------------------------- */ + + // Verbräuche + + const addVerbrauchGenerator = () => { + let i = 0; + let yOffset = 14.6; + const initialHeight = 435 + const initialXOffset = 36; + return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_heizung?: string, klimafaktor?: string) => { + pages[2].drawText(zeitraum_von || "", { + x: initialXOffset, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(zeitraum_bis || "", { + x: initialXOffset + 47, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(energietraeger || "", { + x: initialXOffset + 94, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(primaerfaktor || "", { + x: initialXOffset + 317, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(energieverbrauch || "", { + x: initialXOffset + 351, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(anteil_warmwasser || "", { + x: initialXOffset + 402, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(anteil_heizung || "", { + x: initialXOffset + 453, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[2].drawText(klimafaktor || "", { + x: initialXOffset + 504, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + i++; + } + } + + const addVerbrauch = addVerbrauchGenerator(); + + addVerbrauch( + moment(ausweis.startdatum).format("MM.YYYY"), + moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"), + aufnahme.brennstoff_1, + berechnungen?.primaerfaktor.toString(), + Math.round(berechnungen?.verbrauch_1_kwh).toString(), + Math.round( + berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_1_kwh + ).toString(), + Math.round( + berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_1_kwh + ).toString(), + berechnungen?.klimafaktoren[0].klimafaktor.toString() + ); + + addVerbrauch( + moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"), + moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"), + aufnahme.brennstoff_1, + berechnungen?.primaerfaktor.toString(), + Math.round(berechnungen?.verbrauch_2_kwh).toString(), + Math.round( + berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_2_kwh + ).toString(), + Math.round( + berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_2_kwh + ).toString(), + berechnungen?.klimafaktoren[0].klimafaktor.toString() + ); + + addVerbrauch( + moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"), + moment(ausweis.startdatum).add(3, "year").format("MM.YYYY"), + aufnahme.brennstoff_1, + berechnungen?.primaerfaktor.toString(), + Math.round(berechnungen?.verbrauch_3_kwh).toString(), + Math.round( + berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_3_kwh + ).toString(), + Math.round( + berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_3_kwh + ).toString(), + berechnungen?.klimafaktoren[0].klimafaktor.toString() + ); + + /* -------------------------------- Seite 4 -------------------------------- */ + + const splitToSize = (text: string, size: number, font: PDFFont, fontSize: number) => { + const lines = [] + + let currentLine = "" + for (const char of text) { + if (font.widthOfTextAtSize(currentLine + char, fontSize) <= size) { + currentLine += char; + } else { + lines.push(currentLine) + currentLine = char; + } + } + + lines.push(currentLine) + + return lines.join("\n") + } + + const addEmpfehlungenGenerator = () => { + let i = 0; + let yOffset = 43; + const initialHeight = 568 + const initialXOffset = 36; + return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => { + pages[3].drawText((i + 1).toString(), { + x: initialXOffset, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[3].drawText(splitToSize(bauteil || "", 70, font, 8), { + x: initialXOffset + 25, + y: initialHeight - (i * yOffset), + size: 8, + font, + lineHeight: 10 + }) + + pages[3].drawText(splitToSize(beschreibung || "", 230, font, 8), { + x: initialXOffset + 98, + y: initialHeight - (i * yOffset), + size: 8, + font, + lineHeight: 10 + }) + + + + pages[3].drawText(amortisationszeit || "", { + x: initialXOffset + 403, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + + pages[3].drawText(kosten || "", { + x: initialXOffset + 451, + y: initialHeight - (i * yOffset), + size: 8, + font + }) + i++; + } + } + + const addEmpfehlung = addEmpfehlungenGenerator() + + for (const empfehlung of empfehlungen) { + addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten) + } + + + + // 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 new file mode 100644 index 0000000000000000000000000000000000000000..a1ed6ed718343a0fab538b325eec9022e59f0085 GIT binary patch literal 53757 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 O?sipdHp9blReS;iE1CKL literal 0 HcmV?d00001 diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index 58d200b1..65c06117 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -1001,6 +1001,7 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc bind:ausweis bind:gebaeude bind:aufnahme + {ausweisart} /> diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte index 7aad51ab..e1d2bfc1 100644 --- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte +++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte @@ -20,6 +20,7 @@ import { BenutzerClient } from "#components/Ausweis/types.js"; import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte"; import { Enums } from "@ibcornelsen/database/client"; + import moment from "moment"; export let ausweis: VerbrauchsausweisGewerbeClient; export let user: BenutzerClient = {} as BenutzerClient; @@ -28,7 +29,38 @@ export let bilder: UploadedGebaeudeBild[] = []; export let ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe; - function automatischAusfüllen() {} + function automatischAusfüllen() { + aufnahme.baujahr_gebaeude = [1952]; + aufnahme.baujahr_heizung = [1952]; + aufnahme.saniert = true; + aufnahme.einheiten = 1; + aufnahme.gebaeudetyp = "Polizeidienstgebäude"; + aufnahme.keller = + Enums.Heizungsstatus.NICHT_VORHANDEN; + aufnahme.dachgeschoss = + Enums.Heizungsstatus.NICHT_VORHANDEN; + aufnahme.lueftung = "Fensterlueftung"; + aufnahme.kuehlung = "1"; + ausweis.ausstellgrund = "Vermietung"; + ausweis.verbrauch_1 = 15000; + ausweis.verbrauch_2 = 14000; + ausweis.verbrauch_3 = 16000; + aufnahme.flaeche = 152; + aufnahme.nutzflaeche = 172; + ausweis.keller_beheizt = true; + + aufnahme.brennstoff_1 = "Erdgas H"; + ausweis.einheit_1 = "kWh"; + ausweis.anteil_warmwasser_1 = 18; + ausweis.startdatum = moment("01.01.2021").toDate(); + objekt.plz = "21039"; + objekt.ort = "Hamburg"; + objekt.adresse = "Curslacker Deich 170"; + aufnahme.gebaeudeteil = "Gesamtgebäude"; + + objekt = objekt; + ausweis = ausweis; + } async function spaeterWeitermachen() { } @@ -45,6 +77,7 @@ bind:ausweis bind:aufnahme={aufnahme} bind:objekt={objekt} + {ausweisart} />
@@ -162,6 +195,7 @@ bind:ausweis bind:objekt bind:aufnahme + {ausweisart} />
diff --git a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte index 90c771aa..ff0a0e4b 100644 --- a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte +++ b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte @@ -185,6 +185,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen" bind:ausweis bind:aufnahme={aufnahme} bind:objekt={objekt} + {ausweisart} />
@@ -291,6 +292,7 @@ const ausweisart: Enums.Ausweisart = "VerbrauchsausweisWohnen" bind:ausweis bind:objekt={objekt} bind:aufnahme + {ausweisart} />
diff --git a/src/pages/pdf/ansichtsausweis.ts b/src/pages/pdf/ansichtsausweis.ts index dc5cdc7e..f71add4a 100644 --- a/src/pages/pdf/ansichtsausweis.ts +++ b/src/pages/pdf/ansichtsausweis.ts @@ -1,5 +1,6 @@ -import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; +import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; +import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js"; import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js"; import { Enums } from "@ibcornelsen/database/client"; import { APIRoute } from "astro"; @@ -71,7 +72,12 @@ export const GET: APIRoute = async (Astro) => { } }); - const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + let pdf: Uint8Array | null = null; + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user); + } return new Response(pdf, { headers: { @@ -90,6 +96,7 @@ export const POST: APIRoute = async (Astro) => { const aufnahme = JSON.parse(params.get("aufnahme")); const objekt = JSON.parse(params.get("objekt")); const bilder = JSON.parse(params.get("bilder")); + const ausweisart: Enums.Ausweisart = params.get("ausweisart") let user: BenutzerClient = {}; @@ -103,7 +110,12 @@ export const POST: APIRoute = async (Astro) => { } - const pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + let pdf: Uint8Array | null = null; + if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { + pdf = await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user); + } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { + pdf = await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user); + } return new Response(pdf, { headers: { From cfa9115af8e1a15bde93690e5773eb5f1c60335e Mon Sep 17 00:00:00 2001 From: Robert Jagtiani Date: Mon, 10 Feb 2025 18:14:05 +0100 Subject: [PATCH 08/11] widget --- .../right-sidebar/promo-boxes_immowelt_CD.ai | 82 ++++++++-------- .../design/content/WidgetCardTemplate.svelte | 45 ++++----- .../widgets/WelcherAusweisWidget_1.svelte | 95 ++++++++++++------- 3 files changed, 124 insertions(+), 98 deletions(-) diff --git a/public/images/right-sidebar/promo-boxes_immowelt_CD.ai b/public/images/right-sidebar/promo-boxes_immowelt_CD.ai index 30a24cc8..e5a9c8d8 100644 --- a/public/images/right-sidebar/promo-boxes_immowelt_CD.ai +++ b/public/images/right-sidebar/promo-boxes_immowelt_CD.ai @@ -16,9 +16,9 @@ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> Adobe Illustrator 29.2 (Windows) - 2025-02-09T20:03:59+02:00 - 2025-02-09T20:04:00+01:00 - 2025-02-09T20:04:00+01:00 + 2025-02-09T20:52:53+02:00 + 2025-02-09T20:52:53+01:00 + 2025-02-09T20:52:53+01:00 @@ -94,7 +94,7 @@ proof:pdf xmp.did:71f7c921-7cc6-f647-a871-be4eb8e3caf5 - uuid:ee55951b-5b21-40b0-af44-62669700731b + uuid:945f3e14-faac-47ba-b3bb-05a5dec6096d uuid:24e93842-72cd-4d84-b6a3-b36e5bfa434f uuid:b9b81f05-8bea-463a-95f1-d0f06564ace5 @@ -146,7 +146,7 @@ -endstream endobj 3 0 obj <> endobj 5 0 obj <>/Properties<>>>/Thumb 27 0 R/TrimBox[0.0 0.0 272.0 112.0]/Type/Page/PieceInfo<>>> endobj 25 0 obj <>stream +endstream endobj 3 0 obj <> endobj 5 0 obj <>/Properties<>>>/Thumb 27 0 R/TrimBox[0.0 0.0 272.0 112.0]/Type/Page/PieceInfo<>>> endobj 25 0 obj <>stream Hn\7 FmݢMp $ xbOEEk+Q9~C|Q?>ze`[Nsۧ?7\[ZnZp8ZYrd:R-iOf϶—jS5xNv,9y3fKJ/TƑJFc\ FhbiIb_KjVԴV@GJEŁ1S15 ^ܧevP2.g&PeTe>:/.+jg,G&­=ő/[v,ݰÓa*'C"@d,*D,U[hs3,rժwUt|zC^JGCELWeQ#|ոJ ]:Tnz8;@Ak)B46(DPކT혀]S'ƅ@Xhy&Z3 Dΰ<- e@nd%: zQ{2@ ֜4* q 4S @P{ VBluK2,x6bjE @@ -161,13 +161,13 @@ o endstream endobj 27 0 obj <>stream 8;Xp,*=B14i&Z%sTT'.!@L*.k5XDIg-BDR:*25Io)o/X!C'IEL5VQV&cC?'9%'YUF -ihL#Qn[19aQfFlJBY`f/9V5U@bcjF7M2(O!!!$!rr<$!s8N0$Zb=oh~> -endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream +endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.2.1 %%For: (Robert Jagtiani) () %%Title: (promo-boxes_immowelt_CD.ai) -%%CreationDate: 2/9/2025 8:03 PM +%%CreationDate: 2/9/2025 8:52 PM %%Canvassize: 16383 %%BoundingBox: 1 9 272 121 %%HiResBoundingBox: 1 9.13841515346576 272 120.500000000001 @@ -207,31 +207,35 @@ endstream endobj 8 0 obj < %%EndComments endstream endobj 11 0 obj <>stream -%AI24_ZStandard_Data(/Xtj:ENp8?7 s=ً=i۶W {aHpgW ߣ?:ѕC,sC O ,'Ykqi}w.woǵ2׷no㾭wveo溷uZ^q<-[EerecYGMR|ovw=nr;s7|;8<"9K7omm}6p 7q7r+ins8㸎}ȅȍɕ\Lwq: ;;+io{<<^艥uwcveϟǿ}_5An vvA0EpIse:! {`b8dXY؉]DP EQER,~#88#9c&5INn$GvGv#A2$Er$I$s]r++_ a)cIeY8]DNp .E?3e'~?>c;{V^eܷq|󰌗, ~]oL7=,6 ˶oiRXs/n؉]9, 9:6:,㜗ò.51`m !~ p y09,A$AA,`=;75 __}}}۷}L_Nv]b;{׻uoww]s/==yy^qq{^ʮNzu]u\u۝t#99yqmqns\}۷y[q۶moz[JN< x87晗=nq6{EjPkOsz\oue&垻- cD:Iw]գ[է5ĚB\uy5TeQ.D" q}_:ݗ/]S=Aׯ -z`Ӆo]7gXԫtի!f HߔoA[QJSU'RU=ETMCe]}}T],CzOКW(?(j`V= P5{/իq*?>0%MO!_YWԉ7%P }S2Vn5]TЩ#`jM5EE+Ve?hMW}Wr" >ZTӷ79y_CoQ0ߝbYU1<>%q?+I~[c5޶=Zi[3:c7[|JbV&۶Ӏ*=WV<ʇ'OcBKe]z 'Njz|[zD~Oi[7]G߫P&z?x"` qq̳9ia}<7-M{ӞMQN洎T[_8 mղ?]߻ jx3%x;o\kK%[sܾ8oyZw-c-/Ese_rm-cu=ݿmZ/14C}ȯNa_;{녀+[2X}6u'd0,kƐ_-}OEp8ţX@ -FS#5xRª_wM=)5u= ^MV>Ϫԩʂ֭~\_86PuRP럟ﳫrX =_}I;+vFWV<#h P 7 )Q$L]$$VVnP,GUٔb%z=UTz~:Y~? Jd݁8}W[Hxӣ{ Oh*TG!D9u5슿"JXyZǫ)=WQqT7 ~M=(mhS5X?%wM5F\]UʯۺRm۾ߧk(YZ[ M)]N$784C-GOmJ~zo{95z\ )/TCz髡_-v>iz+e@j}P֥}5=}^}jj]G5+:UVCJ}]ʦP|զjMQօֿ=sܻoPK@mj[TS_ׯNWvw}t)JCM_+'{Q0Ŏ}}-YoUT{WUJsTUw5k*zX՚ٲTjO5UUZVyUSؿrږo"оܭտXٔH܏~\)͕TX"\GyWa @U@W74<7EI a:_`p\JG΅qz׉)֓bԨ^(D{Uy7'i|S) ? +%AI24_ZStandard_Data(/XtJ:ENp8?7 s=ً=i۶W {]Ð7l@G~u+9X:cX& +O ƙxz6w\mkeo}[.99NXs>uo봌eq8yZቁP:8zDzԥ[6 p{.wo9qwq,yE>r ??+ jp@@`` tCn!v 0 p ɰ -rq9;8Xy؍ވe}Fp GqGr,LjrHHGdHHdIRVreWze/,R,ǒ,˲IqE艜E-];! ~A fO}_.vy^moa/5Yq:c?, Go ={X=m,3rm:,nL^z%&p]9rXr umuXֹ9/wwey]jRwc z,#1C1 C0/v!r;asX$H#8"(!Xz`v n 9 j0,?#? oǿa򗿲dvuw\:ᄏ^z7z'zzy<,]ّ؅؁뺎nx;.w%Gr$7r"'r!q88,۸4r+7r7q 7ponm#yA=qo|s3/7{7ݷm;Q:ԠtמZLf1=w[Yc5`32uߓﺞGOk5¹ + j*} rʢ\Dl;]Zu/M_"=*{J_Oի Hn?SRj}RWW+被WC)ߺ߃3ȧN*e_z*.T,Y뇘5PMQ߿ rQ!xeSպ{=0D}kt_(WgU~|`TKHCP5 _RX!oK0H??N>R(4xL꟞Ӷ7oW_M~E>7y{g/sӶyyoZޛNߧ=m{ ;i勇.p0ce?awgK7~1/Ǘw޸2K/&} =pZ[B3_*"]ueOXw]ǿZƼ{ۼ-.u_bh]z_:щwZc( UWxzjϖ^MXJj M|W:?x=ʊSwR9-wmӜ:ךCfk?]_l``H]ޜcn]*[{+BSӫz˕\_EQXxM ,<0$]]~bCll``ֶmlYtmCBϾݗn0|= ,YbQ")S#5xRª_wM=)5u= ^MV>Ϫԩʂ֭~\_86PuRP럟ﳫrX =_}I;+vFWV<#h P 7 )Q$L]$$VVnP,GUٔb%z=UTz~:Y~? Jd݁8}W[Hxӣ{ Oh*TG!D9u5슿"JXyZǫ)=WQqT7 ~M=(mhS5X?%wM5F\]UʯۺRm۾ߧk(YZ[ M)]N$784C-GOmJ~zo{95z\ )/TCz髡_-v>iz+e@j}P֥}5=}^}jj]G5+:UVCJ}]ʦP|զjMQօֿ=sܻoPK@mj[TS_ׯNWvw}t)JCM_+'{Q0Ŏ}}-YoUT{WUJsTUw5k*zX՚ٲTjO5UUZVyUSؿrږo"оܭտXٔH܏~\)͕TX"\GyWa @U@W74<7EI a:_`p\JG΅qz׉)֓bԨ^(D{Uy7'i|S) ? a~dDۏ3%z,/W۳d7g*J=]Zڢ;[!Q6 hY) @UJq3m q&>f[j;8cY7o{[uiOv>};y}2%lDBH&/@V,h=ʲa笪ii/teTXVqM0䁱 `+XB%3YcXc 1g,3lʇ^-Xlұenb+JR+RQ*XcW xMO%Ŋe]'BC.>q ->̂Wک`U^/o , S2:>7HNp! ٠G=yM$D+:*҄CXF21Ȍ|H>Ny::zy9 eNhDh2hdj8 -#P`pΉ#Q#Ab0m\J=6&20zV1zV%tPY bͮ#ٓm3űC ka$ˆI.N@0,{i+of~2+ kgv @cF`V3{E*@ViƇ -4Cရ݃y9|/-;AK$"O@&g %Qw to"UZ .BPmWérRkl# D0 k -WRɎ*6dH|#ű:>#z@3E&zO qCD`M q( --DAnG:pLT q-"Tyu8,=r8䗉AGstHZHa`Yl';9pS>;J.Dp|M'[gOzpVAf ,h"Ƈ:'Px2B@lPIb4 >NEEbwMAl,gVQXbc`ߤ(`fw+xnb!6-+*S@h2Vzd#i(jMaap - e (/ 4H%`Bԝ2J ȥnRKA{r£#cIb@pEBA,$

d <.сa2 yc` P Ds[RPVQ͊9b`eUdj5Y ,%)ڄbq@(P%<HwюpEdM!qE! E2P<'?ɤdu --ϝHv͜!fF8l'g-RZQo>/tF1yiQ'|v*-F+BP"uP -xr&taHў@Caen7 -oiG¥Jf`ـ@搉cy#=/% @VF4;>L r)C ,sQ@CCaCU'!U )A]OGp0 'A ,cqnE|H lRe.H^õר Sph#փΐV ]p+TH4<0nP8 -?Uvr/?ss+ҙ8xJ4"6ES,"<:KN|~|܇]2OPDdApP>Zet`MEH" Dq@:P"AKIrOw=opX`ꉏleNvA6&JnV - ԨAWHW80a$NF6q2[54: ,0tPt7"dTqyT -E'": xd\.b/pe&4QL\C!*Dр& -(4bbuH*Z@D ']DqXX#` IewDTpee$ y: JlHU"9T8bDMV E ,_)"oTKOd 9RhFM?dRW> ;&2cB!"tDr;h 4[X֊8aTdb,}& -%Qh&ODaH!Gh8DBɶ(l#䉛3dUfCi-J3K rE&EEp 9ǖN@yhD$da$fGR)#"8)?r}E`[0ZLha4I"{I}ahڦh4?$ķA\gΗ]=aQ[>K+nb?+Ů=QO5MS\離f暪߷hE;u?@3uzbfwXp-bSj]Ã@]l.Pӆ1Ѝ ysDĈ1:n)`H.D~ȴ +meyޛ2Ʋ{kۼsݶqZƲ˰lȿWO pqyߖ59i}Zwܧ<֞֟,T]Wmq6ut2ާ?vy<|]ﲷ}]fR'5Ų[[W q# J\}t%!ɜ0%ӪIJ݀Q* X&܏51Zyz>lse7,u_Q*uϰ:_JݔT&kz_5-Ŷ.V,`:*r!xeWe`N\ +~ykXy`$>k#o'dt:}n 88: ) $C>2A&z&4:&IVt ׉EU4S *3dbV)#3,2|, ,tt&sbH+ˀy4шdpF2&.i89  F F("`$ +.*#zl0?Ld` +cJ財d0] F'&g&cHD ]ЁBcaYbdW. + , eVnA9ARƌgTp +<"ir 7r_[Mc}HD.M0!pK +0`yL4;3E\ڮS_ %mF" m``uI+*LҥkTTSm< .8F)c/>uz}rF@fMBD!Ɖ&($XP ,[ݤ +t [["DpXzp/*"'4ZNwrp! zM|&wa6]46( 8$NZ&Ξ2Bܯ) P'XQ$D؍uO0d&ؔ3ԡDh@|8VX8!?2I5PV4W@sBl[vWU2g- d-"9FaP4<"Ԛl +0Q_h>(K)ߩ;e8K!ܤ>G!G ƒ*ᐋʃYHxț| /x:],@AeCǐ$0瀷1řHs2B$ +RɈRGQ+kpXKR (s !GPJ@y +2'DģJg ,s8NCz(CIexj8 NVOI+U ,Z;9CWpd'2!O([&lGB z^!JέhhVw:}~1"4JR +Xѳ ح懆hOB@Rlh!a$N:X܊Zk<@ D٤8\kQg'@D4|18(G!!(e:Wix`@pNEp_D +CV4ƥ3qP:\A#hDLmYD@y"ue +γ-ಡd} W29D (Dt("E(>(^wzH|ʜlM ݬBQ!8!)6󑐯q a$=H2w7m9eki@u+Xa4x+oDsɨ2 0ևO"Dtp\^0LiBT=M -%Qh$XB(T ҉NN.P%ⰰGb AJ3 < >v7H2 uFRِDhspĈ2! XֿRD ʗl%Ɍr:*l~>A  5*}vLx<[k" -}dƄBD蠉 v0h81qtXL"KT+eM (B +EqpՅ.mQ0GR7g\#̆ PE[f`ٗ( + ZL04s-#(\r ͇95ЌHlHFS͎+(RFEp eS~f# +`,{ 7`AAI$hDl $þ/$yM_NiIo9]֝/ͻztân}AKW~V]{؟WkZ7EI 5UoxM۞aO~^7ﺞ-Z_'0Z_~BWGWR M=uk`.Wo+.e_ u STW$ؑR _kY8-VU<#Hrbb`YA`lacCdlxWq=@0e%pPw Daq8@>E;u?@3uzbfwXp-bSj]Ã@]l.Pӆ1Ѝ ysDĈ1:n)`H.D~ȴ FrDY_l,^0^TܩCQD4<}(ȏCQ@p !HIa(VM(@;UҞeA!gPtI&&JũB3L(ȄCKj$h"slY|Eq(,qAga {91 RԔHd7 W/`Dc3]*7<2EAa^MwDЮL3ԙh@p'`Do?-T5^r cpw#lP"!&>(D_i119y2m41iʜW´=@B@2S d 8(:Ʀ\ ,3AV`qZ$*#Bز,t'D !0+L #SHZO3OT: r܇}*&MUEMtQ.J{XTԺ8vXr4DǞL8T{2L8TyBHq Ϥ5&I%-g鐏̨Ԑ"3%|^% d@{d%B-B%Ӌe8^%8.Gqi  ǵpN ; (Jr*[S((b$;y1&ɼ&*)Rg)1 ,k'&D0$H 4J06PF肅clh(8ZJ8ЯT & hcE*FJ_CJi/Ty2wCF6L{WlJ#64ĎPJ~p;Q& ARLRAr I›G1e$Q X@C1O(CrPRD)tRO&?pq($L8ДVqB&J ũ #!H%RItL8T9O8Ti юB a LDhɐMOX."Nev e;m8q4,pqE6l686 rH4+WJa!y ]ȼZѬ&|.IǮ..ǎoo.JiqnT䁺.J#a 46y.im$|, L  E_Ax( JyIw4>-ȴV] 6 'nyWIr 6Ԃ;pK6Ma&4 P0G1iK81-,emx0m"…2dv4rH@y8P  Ex}d1 cCj((}A$Ɍ"8Pԭqr@|HS5F nVZ.K21e %*21Ud:DhB9>@d~c236:XBQi;.(X2.dę8qZaptt%X~G,3-*o$L&>w|d% #cRLw|d$ -%NQq1.Ё(v֬4G¼H4S)ܿM4űVsqlد&j~X:@?8v[G8|=', ˪ 4?̄gq5$ ʒB)aQM8 uE C4"0@I&:*"PDL.:&0*H0$bHQ SΙX)Q=g~}s8E%Bv%ZE#դ3K0^ 5n뢴Sxhjt@0 _P3>tpq]01\xUl}!x*@z$|=Щ ] 7WkJ": @@ -283,15 +287,9 @@ ZW } *LcydnA2閂Vh`[ 6A.Q;52 !rt}J%phS:_CдwFmc/nGق NN )Eewšro$<ך\\XPt?MD &ZJߪeDt1lGw\ ->Y4KLu!@?l/W&66ETJc*[$,=f|=+y8,-#(X/"(cx#MTzc&B2C]V.`6,ܺJ" Co F"d:y/i -F$P݇/np:N'69|f f$#[3x8@u܀ؿSnLA JUvzUK;!5^KrƽJW1ZSS0G4{7*F7SF TӵEQ!+3`HCG I - @ =.&СXvj;$tCĎk)AϜS`hI{C!g32K" ouӯ7"z :" V8*e_a-<\$z6O*:+ʟ'摐(o^)J1, -RhraThvi1<}v۲@{jmNv?f^`xO}BNbԚzl_|j_z-3G~  -/=x+r]K%Bٌ75w9 \c*ay86`8Pc#/}CZ]?<:CD -G;f sj7:+a˂:`~=iubp])n}O[r^-nHpFrگ#S>O! h]-yfQ zGFg}-dǿߪuk(}e?D {mKWIU<P{p`=Z)F^b)F&e` -tރcz=>YJCZ ٙ~zG)dΩOMi}ZJ\X:kH"DSuVӺ6XDITS*nx9t̡ vg0H05q\b]k00·`Zǎ" ##tPve&ijٌ켍`g'ŨkX3v/O$Li=z<%Қ5$R6~%/>LH?0Ww6I9<(E &ZJߪeDt1lGw\ ->Y4KLu!@?l/W&66ETJc*[$,=f|=+y8,-#(X/"(cx#MTzc&B2C]V.`6,ܺJ" Co FXq:y/i +F$P݇/np:N'69|f f$#[3x8@u܀ؿSnLM2/.pҗ(w7$-KLԴXiz7 +.^l^OkMvBoTa7 \DyJV`QrFBO1\Mk&FޖSuI;G^JDl0mv0fl7YqT/X p~r].:zR:~PKCh'N00>$ziƱ9ވFh#^c?4!b~vL%mH֩x]A "2_#hok٪Xn^ok`:F\8^~vdT'=a!^/n1|v[" CظN ̈VƖ di7F5x/lD %N?"(}&H_f x/ f.SV`\os1o_7c~!>z@0yEU |lDt gSK:;o2:wfk$;V[+TFY+ٷ=N#HkC_}=0N"膚xmۅyJ1K16q/VleŠ+q@yϒV:*?J% DwN}x}lzM ߏV\X:kH"DSuVӺ6XDITS*nx9t̡ vg0H05q\b]k00·`Zǎ" ##tPve&ijٌ켍`g'ŨkX3v/O$Li=z<%Қ5$R6~%/>LH?0Ww6I9<(Eri 2#x q3#J*C0]EdLYH8,~=gACܾ_(pMH 04 AsC'.ɤE,'%_g;M$}#ZsqGf -s65ljZbT?M3v9b٫ *xR96={ nY$-] )Ѯ%_wrdR%^U3 :5Nl#:B%3BA<=dCA&w*tYcڱSMYH9YQFN$Eқb}ƃYদҏ>cU[B'9"JhZgDf])Jƌ1%w?Gߒp6i+ D +s65ljZbT?M3v9b٫ *xR96={ nY$-] )Ѯ%_wrdR%ك^U3 :5Nl#:B%3BA<=dCA&w*tYcڱSMYH9YQFN$Eқb}ƃYদҏ>cU[B'9"JhZgDf])Jƌ1%w?Gߒp6i+ D { PnBI#W"l+Klu ˚[[DELÂxB7l\g!Uul_͍TSFւ EB_#4wNRA%Ju !wY5 i$"65 /. TXDU(K*Rkйs UWHIAؠɰR|!,e < բ9#vĪ"Wj!HiH-:YpJ)-,;.JRVh>ТI j|7ܔ7 6mƟq{Xj!HiH-:YpJ)-,;.JRVh>ТI j|7ܔ7 6mƟq{XoRZ7Dl%MLY\.?d>Mn VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> -endstream endobj 22 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 23 0 obj <> endobj 21 0 obj <> endobj 40 0 obj [/View/Design] endobj 41 0 obj <>>> endobj 38 0 obj [/View/Design] endobj 39 0 obj <>>> endobj 36 0 obj [/View/Design] endobj 37 0 obj <>>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <>>> endobj 32 0 obj [/View/Design] endobj 33 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 26 0 obj <> endobj 24 0 obj [21 0 R 23 0 R 20 0 R 19 0 R 18 0 R 22 0 R] endobj 42 0 obj <> endobj xref +endstream endobj 22 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 23 0 obj <> endobj 21 0 obj <> endobj 40 0 obj [/View/Design] endobj 41 0 obj <>>> endobj 38 0 obj [/View/Design] endobj 39 0 obj <>>> endobj 36 0 obj [/View/Design] endobj 37 0 obj <>>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <>>> endobj 32 0 obj [/View/Design] endobj 33 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 26 0 obj <> endobj 24 0 obj [21 0 R 23 0 R 20 0 R 19 0 R 18 0 R 22 0 R] endobj 42 0 obj <> endobj xref 0 43 0000000004 65535 f 0000000016 00000 n @@ -468,7 +466,7 @@ endstream endobj 22 0 obj <> 0000078750 00000 n 0000079588 00000 n trailer -<<1046776A51C78D4A9AE8013BC44B2AAB>]>> +<<2EF854D6CA08B44AA6D94514EB6A560F>]>> startxref 79789 %%EOF diff --git a/src/components/design/content/WidgetCardTemplate.svelte b/src/components/design/content/WidgetCardTemplate.svelte index 860548b3..a4cdc4e1 100644 --- a/src/components/design/content/WidgetCardTemplate.svelte +++ b/src/components/design/content/WidgetCardTemplate.svelte @@ -11,11 +11,8 @@ - - - -

{name}

+

{name}

{#if empfehlung=="ja"} @@ -30,18 +27,29 @@ {alt} />
-

+

ab {price} €

+ -
+
{#each services as [service, check]}
@@ -54,18 +62,7 @@ - @@ -76,21 +73,21 @@ -.sumCent{@apply justify-self-center col-span-2 md:mb-6} -.sumRows{@apply hidden md:grid grid-rows-subgrid row-span-5} -.forServices{@apply block} +.sumCent{@apply justify-self-center col-span-2} +.sumRows{@apply hidden sm:grid grid-rows-subgrid row-span-5 items-center} +.forServices{@apply grid-rows-subgrid row-span-5 items-center col-span-2 justify-center px-6} .image{@apply w-[75%] justify-self-center md:w-[75%] md:pl-12} -.buttoncols{@apply grid grid-cols-1 gap-x-10 w-full +.buttoncols{@apply grid grid-cols-1 gap-x-4 w-full mb-4 md:grid-cols-2 md:w-[auto]} -.buttoncol{@apply mt-[0.5rem] text-center text-black bg-[#ffcc00] rounded-md px-3 py-1 no-underline +.buttoncol{@apply mt-2 md:mt-0 text-center text-black bg-[#ffcc00] rounded-md px-3 py-1 no-underline hover:bg-[#222222] hover:text-white} - .promo{@apply tracking-tighter text-[2rem] text-gray-700 pl-12 m-0 -mt-4; + .price{@apply tracking-tighter text-[2rem] text-[#222222] pl-12 m-0 -mt-4; font-family: "Antique Olive Compact bold";} @@ -102,7 +99,7 @@ hover:bg-[#222222] hover:text-white} } .services { - @apply hidden w-full text-start py-1 md:grid md:grid-cols-[1fr_50px] + @apply hidden text-start py-1 md:grid grid-rows-subgrid row-span-1 items-center md:grid-cols-[1fr_50px] } .services:not(:last-child) { @apply border-b-[1px] border-gray-200; diff --git a/src/components/widgets/WelcherAusweisWidget_1.svelte b/src/components/widgets/WelcherAusweisWidget_1.svelte index cb754428..71f44fa5 100644 --- a/src/components/widgets/WelcherAusweisWidget_1.svelte +++ b/src/components/widgets/WelcherAusweisWidget_1.svelte @@ -2,7 +2,6 @@ import { fade } from "svelte/transition"; import WidgetCardTemplate from "#components/design/content/WidgetCardTemplate.svelte"; import { PRICES } from "#lib/constants.js"; - let gebaeudetyp: string = "bitte auswählen"; let anlass: string = "bitte auswählen"; @@ -16,29 +15,67 @@ const gewerbeHouse = ["Gewerbegebäude", "Mischgebäude"]; + let ausnahme: boolean = false; + let oneBOX: boolean = false; + let threeBOX: boolean = false; + function getBoxes(){ if(twoBoxReason.includes(anlass)){ -document.getElementById('firstrow')?.classList.remove('md:grid-cols-2'); -document.getElementById('firstrow')?.classList.add('md:grid-cols-3'); +document.getElementById('firstrow')?.classList.remove('sm:grid-cols-2'); +document.getElementById('firstrow')?.classList.add('sm:grid-cols-3'); }else{ - -document.getElementById('firstrow')?.classList.remove('md:grid-cols-3'); -document.getElementById('firstrow')?.classList.add('md:grid-cols-2'); +document.getElementById('firstrow')?.classList.remove('sm:grid-cols-3'); +document.getElementById('firstrow')?.classList.add('sm:grid-cols-2'); } +} + +function getCount(){ +if(oneBOX===true){ + console.log('ONE'); + document.getElementById('thirdrow')?.classList.remove('md:grid-cols-6'); + document.getElementById('thirdrow')?.classList.remove('grid-cols-4'); + document.getElementById('thirdrow')?.classList.add('grid-cols-1'); +}else if(threeBOX===true){ + console.log('THREE'); + document.getElementById('thirdrow')?.classList.remove('grid-cols-1'); + document.getElementById('thirdrow')?.classList.remove('grid-cols-4'); + + document.getElementById('thirdrow')?.classList.add('md:grid-cols-6'); } +else{ + console.log('FOUR'); + document.getElementById('thirdrow')?.classList.remove('grid-cols-1'); + document.getElementById('thirdrow')?.classList.remove('md:grid-cols-6'); + document.getElementById('thirdrow')?.classList.add('grid-cols-4'); +} + + + +} - let ausnahme: boolean = false $: { - - ausnahme = ((leerStand === "mehr als 30") || (heizungsAlter === "< 3") || (baujahr === "vor 1978" && einheiten === "bis 4 Wohneinheiten" && sanierungsstatus === "unsaniert")) +ausnahme = ((leerStand === "mehr als 30") || (heizungsAlter === "< 3") || (baujahr === "vor 1978" && einheiten === "bis 4 Wohneinheiten" && sanierungsstatus === "unsaniert")) ? true : false; + +oneBOX = ((ausnahme === true) && (gebaeudetyp != "Gewerbegebäude")) && (gebaeudetyp != "Mischgebäude") || + ((!twoBoxReason.includes(anlass)) && (gebaeudetyp != "Mischgebäude")) + ? true + : false; + +threeBOX = ((ausnahme === true) && (gebaeudetyp === "Mischgebäude") && (twoBoxReason.includes(anlass))) + ? true + : false; + } + + + @@ -56,7 +93,7 @@ $: { @@ -90,7 +127,7 @@ $: {
Sanierungsstand
@@ -122,7 +159,7 @@ $: {
Heizungsalter
- +
+
+ + +
+
+ +
+ Sie haben die Möglichkeit neben der Hauptheizung die Verbräuche weiterer Heizquellen + (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben. + Dazu setzen Sie den Haken bei zusätzlicher Heizquelle. Eine weiterer Bereich zur Eingabe der + Verbräuche öffnet sich dann. +
+
+
+ +
@@ -146,15 +159,14 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8 > {/if}
-
- -
- Sie haben die Möglichkeit neben der Hauptheizung die Verbräuche weiterer Heizquellen - (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben. - Dazu setzen Sie den Haken bei zusätzlicher Heizquelle. Eine weiterer Bereich zur Eingabe der - Verbräuche öffnet sich dann. +
+
+ Bitte geben Sie das Startjahr der ersten Verbrauchsperiode ein. Weitere Zeitangaben müssen nichht + gemacht werden, da alle 3 Verbrauchsjahre zusammenhängend sein sollen. +
+ diff --git a/src/components/DatenblattButton.svelte b/src/components/DatenblattButton.svelte index c16f9226..46dc4e6f 100644 --- a/src/components/DatenblattButton.svelte +++ b/src/components/DatenblattButton.svelte @@ -7,7 +7,7 @@ $: base64 = Buffer.from(JSON.stringify(ausweis), "utf-8").toString("base64"); - + Datenblatt Datenblatt \ No newline at end of file diff --git a/src/components/design/header/AusweisHeader_immowelt.astro b/src/components/design/header/AusweisHeader_immowelt.astro new file mode 100644 index 00000000..785ae47b --- /dev/null +++ b/src/components/design/header/AusweisHeader_immowelt.astro @@ -0,0 +1,60 @@ +--- +import HeaderLogin from "#components/design/header/HeaderLogin.svelte"; +--- + + + +
+
+ + \ No newline at end of file diff --git a/src/layouts/AusweisLayoutDaten_immowelt.astro b/src/layouts/AusweisLayoutDaten_immowelt.astro new file mode 100644 index 00000000..c1c6e2a7 --- /dev/null +++ b/src/layouts/AusweisLayoutDaten_immowelt.astro @@ -0,0 +1,102 @@ +--- +import "../style/global.css"; +import "../style/formular.css"; +import "../../svelte-dialogs.config" +import Header from "#components/design/header/AusweisHeader_immowelt.astro"; +import Footer from "#components/design/footer/Footer.astro"; +import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro"; +import { NotificationWrapper } from "@ibcornelsen/ui"; + +export interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + + + + + + + + + + + + + + + + + + + + + + + + {title || 'Energieausweis online erstellen - Online Energieausweis'} + + + + + +
+ +
+ + + +
+ +
+ +
+ +