diff --git a/.vscode/settings.json b/.vscode/settings.json
index 1f926c5b..44a9fd24 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,5 +1,6 @@
{
"i18n-ally.localesPaths": [
"public/locales"
- ]
+ ],
+ "typescript.tsdk": "node_modules/typescript/lib"
}
\ No newline at end of file
diff --git a/src/client/lib/bilderHochladen.ts b/src/client/lib/bilderHochladen.ts
index f98516ab..0c12ac49 100644
--- a/src/client/lib/bilderHochladen.ts
+++ b/src/client/lib/bilderHochladen.ts
@@ -1,15 +1,16 @@
import { GebaeudeClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
+import { Enums } from "@ibcornelsen/database/client";
import { addNotification, updateNotification } from "@ibcornelsen/ui";
import { client } from "src/trpc";
-export async function bilderHochladen(images: (UploadedGebaeudeBild & { base64?: string })[], gebaeude: GebaeudeClient) {
+export async function bilderHochladen(images: (UploadedGebaeudeBild & { base64?: string })[], gebaeude_uid: string) {
if (images.length == 0) {
return images;
}
// Wenn Bilder hochgeladen werden konvertieren wir sie zu base64, das heißt, dass die base64 Eigenschaft bei diesen Bildern
// existiert. Das müssen wir TypeScript nur wissen lassen, damit es uns in Ruhe lässt.
- const imagesToUpload = images.filter(image => !image.uid) as unknown as { base64: string, kategorie: string, uid?: string }[];
+ const imagesToUpload = images.filter(image => !image.uid || image.update) as unknown as { base64: string, kategorie: string, uid?: string, update: boolean }[];
if (imagesToUpload.length == 0) {
return images;
@@ -27,13 +28,21 @@ export async function bilderHochladen(images: (UploadedGebaeudeBild & { base64?:
const image = imagesToUpload[i];
try {
- const response = await client.v1.bilder.upload.mutate({
- base64: image.base64,
- kategorie: image.kategorie,
- gebaeude_uid: gebaeude.uid
- })
-
- image.uid = response.uid
+ if (image.update) {
+ await client.v1.bilder.update.mutate({
+ uid: image.uid as string,
+ base64: image.base64,
+ kategorie: image.kategorie as Enums.BilderKategorie
+ })
+ } else {
+ const response = await client.v1.bilder.upload.mutate({
+ base64: image.base64,
+ kategorie: image.kategorie as Enums.BilderKategorie,
+ gebaeude_uid
+ })
+
+ image.uid = response.uid
+ }
updateNotification(notification, {
dismissable: true,
diff --git a/src/client/lib/verbrauchsausweisWohnenSpeichern.ts b/src/client/lib/verbrauchsausweisWohnenSpeichern.ts
index 98cb9da0..2ea9b5ba 100644
--- a/src/client/lib/verbrauchsausweisWohnenSpeichern.ts
+++ b/src/client/lib/verbrauchsausweisWohnenSpeichern.ts
@@ -37,7 +37,7 @@ export async function verbrauchsausweisWohnenSpeichern(
},
});
- images = await bilderHochladen(images, gebaeude);
+ images = await bilderHochladen(images, gebaeude.uid);
return { uid: ausweis.uid, gebaeude_uid: gebaeude.uid, gebaeude_aufnahme_uid: gebaeude_aufnahme_allgemein.uid };
} catch (e) {
@@ -57,7 +57,7 @@ export async function verbrauchsausweisWohnenSpeichern(
},
});
- images = await bilderHochladen(images, gebaeude);
+ images = await bilderHochladen(images, response.gebaeude_uid);
return response;
} catch (e: any) {
diff --git a/src/components/Ausweis/Verbrauch.svelte b/src/components/Ausweis/Verbrauch.svelte
index 2d1925da..a39a5a02 100644
--- a/src/components/Ausweis/Verbrauch.svelte
+++ b/src/components/Ausweis/Verbrauch.svelte
@@ -270,7 +270,7 @@
- Verbrauch
+ Verbrauch *
- Verbrauch
+ Verbrauch *
-
Verbrauch
+
Verbrauch *
["gebaeude_aufnahme_allgemein"]["gebaeude_stammdaten"]["gebaeude_bilder"][0] & { base64?: string };
+>["gebaeude_aufnahme_allgemein"]["gebaeude_stammdaten"]["gebaeude_bilder"][0] & { base64?: string, update?: boolean };
/**
diff --git a/src/components/ImageGrid.svelte b/src/components/ImageGrid.svelte
index 8589213f..43210ecf 100644
--- a/src/components/ImageGrid.svelte
+++ b/src/components/ImageGrid.svelte
@@ -2,6 +2,7 @@
import UploadImages from "./UploadImages.svelte";
import type { BedarfsausweisWohnen, Enums, VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
import { GebaeudeClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types";
+ import { RotateCounterClockwise, Trash } from "radix-svelte-icons";
export let images: UploadedGebaeudeBild[] = [];
export let max: number = 4;
@@ -10,8 +11,24 @@
export let gebaeude: GebaeudeClient;
export let kategorie: Enums.BilderKategorie
- console.log(images);
-
+ async function rotateImage(image: UploadedGebaeudeBild): Promise
{
+ return new Promise((resolve, reject) => {
+ let img = new Image();
+ img.src = image.base64 ? image.base64 : `/bilder/${image.uid}.webp`;
+ img.onload = () => {
+ let canvas = document.createElement("canvas");
+ let ctx = canvas.getContext("2d");
+ canvas.width = img.height;
+ canvas.height = img.width;
+ ctx?.translate(img.height / 2, img.width / 2);
+ ctx?.rotate((-90 * Math.PI) / 180);
+ ctx?.drawImage(img, -img.width / 2, -img.height / 2);
+ image.base64 = canvas.toDataURL("image/webp");
+ image.update = true;
+ resolve(image)
+ };
+ })
+ }
@@ -23,20 +40,33 @@
-
+ {
delete images[i];
images = images.filter((x) => x);
}}
>
- R
+
+ {
+ let image = await rotateImage(images[i]);
+ images[i] = image;
+ images = images
+ }}
+ >
+
+
+
{/if}
{/each}
-
+
\ No newline at end of file
diff --git a/src/components/UMBE_Footer.astro b/src/components/UMBE_Footer.astro
new file mode 100644
index 00000000..b142c4bc
--- /dev/null
+++ b/src/components/UMBE_Footer.astro
@@ -0,0 +1,10 @@
+---
+const currentYear = new Date().getFullYear();
+---
+
+
\ No newline at end of file
diff --git a/src/components/UMBE_Header.astro b/src/components/UMBE_Header.astro
new file mode 100644
index 00000000..40c23968
--- /dev/null
+++ b/src/components/UMBE_Header.astro
@@ -0,0 +1,45 @@
+
+
+
\ No newline at end of file
diff --git a/src/components/UMBE_SidebarLeft.astro b/src/components/UMBE_SidebarLeft.astro
new file mode 100644
index 00000000..f1a8dda2
--- /dev/null
+++ b/src/components/UMBE_SidebarLeft.astro
@@ -0,0 +1,9 @@
+---
+import Navigation from "../components/UMBE_navcard.astro";
+---
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/UMBE_SidebarRight.astro b/src/components/UMBE_SidebarRight.astro
new file mode 100644
index 00000000..57b22141
--- /dev/null
+++ b/src/components/UMBE_SidebarRight.astro
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/components/UMBE_navcard.astro b/src/components/UMBE_navcard.astro
new file mode 100644
index 00000000..72a2214d
--- /dev/null
+++ b/src/components/UMBE_navcard.astro
@@ -0,0 +1,100 @@
+
+
+
+
+
+ Energieausweis erstellen❯
+
+
+
+
+
+
+
+ Welcher Energieausweis
+
+
+
+ Verbrauchsausweis❯
+
+
+
+
+ Bedarfsausweis❯
+
+
+
+
+ Energieausweis❯
+
+
+
+
+ EnEV Zusammenfassung - Archiv
+
+
+
+ Energieausweis Aussteller
+
+
+
+ Kundenbewertungen
+
+
+
+ FAQ
+
+
+
+ Für Entwickler
+
+
+
+
+
\ No newline at end of file
diff --git a/src/layouts/UMBE_Layout.astro b/src/layouts/UMBE_Layout.astro
new file mode 100644
index 00000000..f92c6f4f
--- /dev/null
+++ b/src/layouts/UMBE_Layout.astro
@@ -0,0 +1,96 @@
+---
+import i18next from "i18next";
+
+import "../style/UMBE_global.css";
+import "../../svelte-dialogs.config"
+import Footer from "../components/UMBE_Footer.astro";
+import Header from "../components/UMBE_Header.astro";
+import SidebarLeft from "../components/UMBE_SidebarLeft.astro";
+import SidebarRight from "../components/UMBE_SidebarRight.astro";
+import { NotificationWrapper } from "@ibcornelsen/ui";
+
+export interface Props {
+ title: string;
+}
+
+const { title } = Astro.props;
+
+
+---
+
+
+
+
+
+
+
+
+
+ {title || "Energieausweis online erstellen - Online Energieausweis"}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte b/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte
index f7adab07..bae875ab 100644
--- a/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte
+++ b/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte
@@ -29,6 +29,8 @@
import { VerbrauchsausweisWohnenClient, BenutzerClient, UploadedGebaeudeBild } from "#components/Ausweis/types";
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern";
+ // TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
+ // wenn gebaeude_aufnahme_allgemein oder gebaeude_stammdaten nicht existiert...
export let ausweis: VerbrauchsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient;
@@ -36,8 +38,6 @@
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || [];
-
-
async function spaeterWeitermachen() {
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, gebaeude_aufnahme_allgemein, images, user);
@@ -577,12 +577,7 @@
>F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes
-
+
diff --git a/src/modules/Dashboard/DashboardPDFDesignerModule.svelte b/src/modules/Dashboard/DashboardPDFDesignerModule.svelte
index d30f2144..544e7add 100644
--- a/src/modules/Dashboard/DashboardPDFDesignerModule.svelte
+++ b/src/modules/Dashboard/DashboardPDFDesignerModule.svelte
@@ -19,17 +19,9 @@
let container: HTMLDivElement;
let designer: Designer;
- let page: number = 0;
onMount(() => {
designer = new Designer({ domContainer: container, template, plugins });
-
- console.log(designer);
-
-
- designer.onChangePage((p) => {
- page = p
- });
});
function loadBasePDF() {
@@ -51,6 +43,7 @@
function addNewField() {
template = designer.getTemplate();
+ const page = designer.getPageCursor();
template.schemas[page]["new-field"] = {
type: "text",
diff --git a/src/pages/UMBE_test.astro b/src/pages/UMBE_test.astro
new file mode 100644
index 00000000..a747887c
--- /dev/null
+++ b/src/pages/UMBE_test.astro
@@ -0,0 +1,16 @@
+---
+
+
+import Layout from "#layouts/UMBE_Layout.astro";
+
+
+---
+
+
+ HALLO
+
+
+
+
+
+
diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohnen/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohnen/index.astro
index ba988244..fff18a32 100644
--- a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohnen/index.astro
+++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohnen/index.astro
@@ -1,24 +1,27 @@
---
-
import AusweisLayout from "#layouts/AusweisLayout.astro";
import VerbrauchsausweisWohnenModule from "#modules/Ausweise/VerbrauchsausweisWohnenModule.svelte";
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller";
const uid = Astro.url.searchParams.get("uid");
-let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
+let ausweis: VerbrauchsausweisWohnenClient = {
+ gebaeude_aufnahme_allgemein: { gebaeude_stammdaten: {} },
+} as VerbrauchsausweisWohnenClient;
const caller = createCaller(Astro);
if (uid) {
ausweis = await caller.v1.verbrauchsausweisWohnen.get({
- uid: uid
- })
+ uid: uid,
+ });
if (!ausweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
- return Astro.redirect("/energieausweis-erstellen/verbrauchsausweis-wohnen");
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-wohnen"
+ );
}
}
---
diff --git a/src/pages/pdf/ansichtsausweis.astro b/src/pages/pdf/ansichtsausweis.astro
index b9d4cfa9..e99c2951 100644
--- a/src/pages/pdf/ansichtsausweis.astro
+++ b/src/pages/pdf/ansichtsausweis.astro
@@ -3,10 +3,13 @@ import { generate } from "@pdfme/generator";
import VerbrauchsausweisWohnen2016Template from "../../lib/pdf/templates/GEG24_Verbrauchsausweis.json";
import { convertAusweisData } from "#lib/AusweisData";
import { variable } from "#lib/pdf/plugins/variables";
-import { text, image } from "@pdfme/schemas"
+import { text, image } from "@pdfme/schemas";
import { createCaller } from "#lib/caller";
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
-import { Template } from "@pdfme/common";
+import { Schema, Template } from "@pdfme/common";
+import { Moment } from "moment";
+import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
+import moment from "moment";
const base64 = Astro.url.searchParams.get("base64");
let ausweis: Partial | null = null;
@@ -24,30 +27,153 @@ if (base64) {
const caller = createCaller(Astro);
ausweis = await caller.v1.verbrauchsausweisWohnen.get({
- uid: uidAusweis
- })
+ uid: uidAusweis,
+ });
}
const template = VerbrauchsausweisWohnen2016Template as Template;
+const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis);
-template.schemas.push({})
-template.schemas.push({})
-template.schemas[2]["energie_1"] = {
- position: {
- x: 15,
- y: 140
- },
- height: 5,
- width: 14,
- type: "text",
- fontSize: 8,
- verticalAlign: "middle"
+let inputs: Record = {};
+
+// Verbrauchszeiträume
+const addVerbrauchszeitraum = (() => {
+ let row = 0;
+ let columnWidth = [16, 16, 80, 12, 18, 18, 18, 12];
+
+ const getPosition = (column: number) => {
+ return {
+ position: {
+ x:
+ 15 +
+ columnWidth.reduce(
+ (a, c, i) => (i >= column ? a : a + c),
+ 0
+ ),
+ y: 141 + row * 5,
+ },
+ height: 5,
+ width: 14,
+ type: "text",
+ fontSize: 8,
+ verticalAlign: "middle",
+ };
+ };
+
+ return (
+ schema: Schema,
+ start: Moment,
+ end: Moment,
+ energietraeger: string,
+ primaerenergiefaktor: number,
+ energieverbrauch: number,
+ anteilWarmwasser: number,
+ klimafaktor: number
+ ) => {
+ inputs[`verbrauchszeitraum_${row}_start`] = start.format("MM.YYYY");
+ inputs[`verbrauchszeitraum_${row}_end`] = end.format("MM.YYYY");
+ inputs[`verbrauchszeitraum_${row}_energietraeger`] = energietraeger;
+ inputs[`verbrauchszeitraum_${row}_primaerenergiefaktor`] =
+ primaerenergiefaktor.toString();
+ inputs[`verbrauchszeitraum_${row}_energieverbrauch`] =
+ energieverbrauch.toString();
+ inputs[`verbrauchszeitraum_${row}_anteil_warmwasser`] = Math.round(
+ anteilWarmwasser * energieverbrauch
+ ).toString();
+ inputs[`verbrauchszeitraum_${row}_anteil_heizung`] = Math.round(
+ (1 - anteilWarmwasser) *
+ energieverbrauch
+ ).toString();
+ inputs[`verbrauchszeitraum_${row}_klimafaktor`] =
+ klimafaktor.toString();
+
+ schema[`verbrauchszeitraum_${row}_start`] = getPosition(0);
+ schema[`verbrauchszeitraum_${row}_end`] = getPosition(1);
+ schema[`verbrauchszeitraum_${row}_energietraeger`] = getPosition(2);
+ schema[`verbrauchszeitraum_${row}_primaerenergiefaktor`] =
+ getPosition(3);
+ schema[`verbrauchszeitraum_${row}_energieverbrauch`] = getPosition(4);
+ schema[`verbrauchszeitraum_${row}_anteil_warmwasser`] = getPosition(5);
+ schema[`verbrauchszeitraum_${row}_anteil_heizung`] = getPosition(6);
+ schema[`verbrauchszeitraum_${row}_klimafaktor`] = getPosition(7);
+
+ row++;
+ };
+})();
+
+
+addVerbrauchszeitraum(
+ template.schemas[2],
+ moment(ausweis.startdatum),
+ moment(ausweis.startdatum).add("1", "year"),
+ ausweis.gebaeude_aufnahme_allgemein?.brennstoff_1,
+ berechnungen?.primaerfaktorww,
+ berechnungen?.verbrauch_1_kwh,
+ ausweis.anteil_warmwasser_1 / 100,
+ berechnungen?.klimafaktoren[0].klimafaktor
+);
+
+addVerbrauchszeitraum(
+ template.schemas[2],
+ moment(ausweis.startdatum).add("1", "year"),
+ moment(ausweis.startdatum).add("2", "years"),
+ ausweis.gebaeude_aufnahme_allgemein?.brennstoff_1,
+ berechnungen?.primaerfaktorww,
+ berechnungen?.verbrauch_2_kwh,
+ ausweis.anteil_warmwasser_1 / 100,
+ berechnungen?.klimafaktoren[1].klimafaktor
+);
+
+addVerbrauchszeitraum(
+ template.schemas[2],
+ moment(ausweis.startdatum).add("2", "years"),
+ moment(ausweis.startdatum).add("3", "years"),
+ ausweis.gebaeude_aufnahme_allgemein?.brennstoff_1,
+ berechnungen?.primaerfaktorww,
+ berechnungen?.verbrauch_3_kwh,
+ ausweis.anteil_warmwasser_1 / 100,
+ berechnungen?.klimafaktoren[2].klimafaktor
+);
+
+if (ausweis.zusaetzliche_heizquelle) {
+ addVerbrauchszeitraum(
+ template.schemas[2],
+ moment(ausweis.startdatum),
+ moment(ausweis.startdatum).add("1", "year"),
+ ausweis.gebaeude_aufnahme_allgemein?.brennstoff_2,
+ berechnungen?.primaerfaktorww_1,
+ berechnungen?.verbrauch_4_kwh,
+ ausweis.anteil_warmwasser_2 / 100,
+ berechnungen?.klimafaktoren[0].klimafaktor
+ );
+
+ addVerbrauchszeitraum(
+ template.schemas[2],
+ moment(ausweis.startdatum).add("1", "year"),
+ moment(ausweis.startdatum).add("2", "years"),
+ ausweis.gebaeude_aufnahme_allgemein?.brennstoff_2,
+ berechnungen?.primaerfaktorww_1,
+ berechnungen?.verbrauch_5_kwh,
+ ausweis.anteil_warmwasser_2 / 100,
+ berechnungen?.klimafaktoren[1].klimafaktor
+ );
+
+ addVerbrauchszeitraum(
+ template.schemas[2],
+ moment(ausweis.startdatum).add("2", "years"),
+ moment(ausweis.startdatum).add("3", "years"),
+ ausweis.gebaeude_aufnahme_allgemein?.brennstoff_2,
+ berechnungen?.primaerfaktorww_1,
+ berechnungen?.verbrauch_6_kwh,
+ ausweis.anteil_warmwasser_2 / 100,
+ berechnungen?.klimafaktoren[1].klimafaktor
+ );
}
const pdf = await generate({
template,
plugins: { text, image, variable },
- inputs: [{...convertAusweisData(ausweis), energie_1: "Hallo"}],
+ inputs: [{ ...convertAusweisData(ausweis), ...inputs }],
options: {
author: "IB Cornelsen",
creationDate: new Date(),
@@ -62,4 +188,4 @@ return new Response(pdf, {
"Content-Type": "application/pdf",
},
});
----
\ No newline at end of file
+---
diff --git a/src/style/UMBE_global.css b/src/style/UMBE_global.css
new file mode 100644
index 00000000..f53e8063
--- /dev/null
+++ b/src/style/UMBE_global.css
@@ -0,0 +1,48 @@
+@import url('https://fonts.googleapis.com/css2?family=Abel&display=swap');
+@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,400&display=swap");
+
+* {
+ font-weight: 400;
+ box-sizing: border-box;
+ font-family: "Abel", "Poppins", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+}
+
+
+
+
+
+
+
+
+
+article hr {
+ @apply mb-4 mt-4;
+}
+
+article {
+ @apply px-6 md:px-8 py-6 w-full relative bg-white;
+}
+
+article h1 {
+ @apply text-4xl font-normal my-4;
+}
+
+article h2 {
+ @apply text-2xl font-normal my-4;
+}
+
+article h3 {
+ @apply text-xl font-normal my-2;
+}
+
+article a {
+ @apply text-blue-700 font-medium text-lg;
+}
+
+article select {
+ @apply rounded-lg px-2 py-1.5 outline-none;
+}
+
+.checkbox {
+ @apply h-5 w-4 checkbox-secondary;
+}
\ No newline at end of file