Merge pull request #518 from IBCornelsen/dev

Fix Bedarfsausweis
This commit is contained in:
Jens Cornelsen
2025-04-23 00:12:45 +02:00
committed by GitHub
13 changed files with 162 additions and 91 deletions

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 10 MiB

After

Width:  |  Height:  |  Size: 10 MiB

View File

@@ -443,13 +443,17 @@
<span class="font-bold">Gebäude (Bj {aufnahme.baujahr_gebaeude})</span> mit <span class="font-bold">Gebäude (Bj {aufnahme.baujahr_gebaeude})</span> mit
{#if aufnahme.flaeche > 0 && aufnahme.flaeche !== null} {#if aufnahme.flaeche > 0 && aufnahme.flaeche !== null}
{aufnahme.flaeche} m² Wohnfläche {aufnahme.flaeche} m² Wohnfläche
sowie
{/if} {/if}
{aufnahme.nutzflaeche} m² energetische Nutzfläche. Als Ausstellgrund wurde {ausweis.ausstellgrund} angegeben. {#if aufnahme.nutzflaeche === 0}
. Die energetische Nutzfläche wurde nach §82 GEG aus der Wohnfläche ermittelt.
{:else}
sowie {aufnahme.nutzflaeche} m² energetische Nutzfläche.
{/if}
Als Ausstellgrund wurde {ausweis.ausstellgrund} angegeben.
{aufnahme.gebaeudeteil === "Wohnen" {aufnahme.gebaeudeteil === "Wohnen"
? "Die eingegebenen Daten beziehen sich auf den Wohnteil eines gemischt genutzten Gebäudes." ? "Die eingegebenen Daten beziehen sich auf den Wohnteil eines gemischt genutzten Gebäudes."
: "Die eingegebenen Daten beziehen sich auf das gesamte Gebäude."} : "Die eingegebenen Daten beziehen sich auf das gesamte Gebäude."}
{aufnahme.saniert ? "Das Gebäude ist in unsaniertem Zustand." : "Das Gebäude ist in saniertem Zustand."} {aufnahme.saniert ? "Das Gebäude ist in saniertem Zustand." : "Das Gebäude ist in unsaniertem Zustand."}
</div> </div>
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe} {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
<div class="text-sm"> <div class="text-sm">
@@ -523,7 +527,6 @@
{aufnahme.standard_kessel ? "Standardkessel, " : ""} {aufnahme.standard_kessel ? "Standardkessel, " : ""}
{aufnahme.durchlauf_erhitzer ? "Durchlauferhitzer, " : ""} {aufnahme.durchlauf_erhitzer ? "Durchlauferhitzer, " : ""}
{aufnahme.solarsystem_warmwasser ? "Solarsystem für Warmwasser, " : ""} {aufnahme.solarsystem_warmwasser ? "Solarsystem für Warmwasser, " : ""}
{aufnahme.waermepumpe ? "Wärmepumpe, " : ""}
{aufnahme.brennwert_kessel ? "Brennwertkessel, " : ""} {aufnahme.brennwert_kessel ? "Brennwertkessel, " : ""}
{aufnahme.standard_kessel ? "Standardkessel, " : ""} {aufnahme.standard_kessel ? "Standardkessel, " : ""}
{aufnahme.warmwasser_rohre_gedaemmt ? "Warmwasserrohre gedämmt, " : ""} {aufnahme.warmwasser_rohre_gedaemmt ? "Warmwasserrohre gedämmt, " : ""}

View File

@@ -15,10 +15,11 @@
BenutzerClient, BenutzerClient,
ObjektKomplettClient, ObjektKomplettClient,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import { RechnungSchema } from "src/generated/zod/rechnung.js"; import { Benutzer } from "#lib/server/prisma.js";
export let lightTheme: boolean; export let lightTheme: boolean;
export let benutzer: BenutzerClient; export let benutzer: Benutzer;
export let besteller: Benutzer;
let id: string; let id: string;
</script> </script>
@@ -70,14 +71,14 @@
</div> </div>
<div> <div>
<div> <div>
{benutzer.vorname} {benutzer.name} {besteller.vorname} {besteller.name}
</div> </div>
<div class="text-xs text-gray-500"> <div class="text-xs text-gray-500">
Eigentümer oder im Auftrag Eigentümer oder im Auftrag
</div> </div>
<div class="text-xs text-gray-500"> <div class="text-xs text-gray-500">
<!-- Soll für den Aussteller sichtbar sein --> <!-- Soll für den Aussteller sichtbar sein -->
Telefon {benutzer.telefon} Telefon {besteller.telefon}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -18,19 +18,19 @@ const { title } = Astro.props;
--- ---
<script> <script>
import { H } from "highlight.run"; // import { H } from "highlight.run";
if (import.meta.env.PROD) { // if (import.meta.env.PROD) {
H.init("1jdkoe52", { // H.init("1jdkoe52", {
serviceName: "online-energieausweis", // serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public", // backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true, // tracingOrigins: true,
networkRecording: { // networkRecording: {
enabled: true, // enabled: true,
recordHeadersAndBody: true // recordHeadersAndBody: true
} // }
}); // });
} // }
window.addEventListener("scroll", () => { window.addEventListener("scroll", () => {
const skala = document.getElementById("skala"); const skala = document.getElementById("skala");

View File

@@ -18,19 +18,19 @@ const { title } = Astro.props;
--- ---
<script> <script>
import { H } from "highlight.run"; // import { H } from "highlight.run";
if (import.meta.env.PROD) { // if (import.meta.env.PROD) {
H.init("1jdkoe52", { // H.init("1jdkoe52", {
serviceName: "online-energieausweis", // serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public", // backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true, // tracingOrigins: true,
networkRecording: { // networkRecording: {
enabled: true, // enabled: true,
recordHeadersAndBody: true // recordHeadersAndBody: true
} // }
}) // })
} // }
</script> </script>

View File

@@ -35,19 +35,19 @@ const schema = JSON.stringify({
--- ---
<script> <script>
import { H } from "highlight.run"; // import { H } from "highlight.run";
if (import.meta.env.PROD) { // if (import.meta.env.PROD) {
H.init("1jdkoe52", { // H.init("1jdkoe52", {
serviceName: "online-energieausweis", // serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public", // backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true, // tracingOrigins: true,
networkRecording: { // networkRecording: {
enabled: true, // enabled: true,
recordHeadersAndBody: true // recordHeadersAndBody: true
} // }
}) // })
} // }
</script> </script>
<!DOCTYPE html> <!DOCTYPE html>

View File

@@ -3,14 +3,15 @@
import "../style/global.css"; import "../style/global.css";
import "../../svelte-dialogs.config.js"; import "../../svelte-dialogs.config.js";
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte"; import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte";
import { BenutzerClient } from "#components/Ausweis/types"; import { Benutzer } from "#lib/server/prisma";
export interface Props { export interface Props {
title: string; title: string;
user: BenutzerClient; user: Benutzer;
besteller: Benutzer;
} }
const { title, user } = Astro.props; const { title, user, besteller } = Astro.props;
if (!user) { if (!user) {
Astro.redirect("/auth/login", 302); Astro.redirect("/auth/login", 302);
@@ -44,21 +45,29 @@ const schema = JSON.stringify({
let lightTheme = Astro.cookies.get("theme")?.value === "light"; let lightTheme = Astro.cookies.get("theme")?.value === "light";
--- ---
<script> <script >
import { H } from "highlight.run"; // import { H } from "highlight.run";
if (import.meta.env.PROD) { // const user = JSON.parse(document.body.dataset.user);
H.init("1jdkoe52", {
serviceName: "online-energieausweis", // if (import.meta.env.PROD) {
backendUrl: // H.init("1jdkoe52", {
"https://highlight-backend.online-energieausweis.org/public", // serviceName: "online-energieausweis",
tracingOrigins: true, // backendUrl:
networkRecording: { // "https://highlight-backend.online-energieausweis.org/public",
enabled: true, // tracingOrigins: true,
recordHeadersAndBody: true, // networkRecording: {
}, // enabled: true,
}); // recordHeadersAndBody: true,
} // }
// });
// if (user) {
// H.identify(user.email, {
// id: user.id
// })
// }
// }
</script> </script>
<html lang="de"> <html lang="de">
@@ -108,7 +117,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
</title> </title>
</head> </head>
<body> <body data-user={JSON.stringify({ id: user.id, email: user.email })}>
<main <main
class="p-0 grid max-w-[1920px] class="p-0 grid max-w-[1920px]
xs:grid-cols-[minmax(1fr,1fr)] xs:gap-1 xs:p-0 xs:grid-cols-[minmax(1fr,1fr)] xs:gap-1 xs:p-0
@@ -121,6 +130,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
<DashboardSidebar <DashboardSidebar
lightTheme={lightTheme} lightTheme={lightTheme}
benutzer={user} benutzer={user}
besteller={besteller}
client:load client:load
/> />

View File

@@ -19,19 +19,19 @@ const { title } = Astro.props;
--- ---
<script> <script>
import { H } from "highlight.run"; // import { H } from "highlight.run";
if (import.meta.env.PROD) { // if (import.meta.env.PROD) {
H.init("1jdkoe52", { // H.init("1jdkoe52", {
serviceName: "online-energieausweis", // serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public", // backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true, // tracingOrigins: true,
networkRecording: { // networkRecording: {
enabled: true, // enabled: true,
recordHeadersAndBody: true // recordHeadersAndBody: true
} // }
}) // })
} // }
/* /*
window.addEventListener("scroll", (event) => { window.addEventListener("scroll", (event) => {

View File

@@ -167,21 +167,21 @@
><GebaeudeDaten bind:aufnahme bind:objekt {ausweisart} /></Bereich ><GebaeudeDaten bind:aufnahme bind:objekt {ausweisart} /></Bereich
> >
<!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen --> <!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen
<Bereich <Bereich
bereich="C" bereich="C"
title="Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen" title="Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen"
><GebaeudeVolumen bind:ausweis /></Bereich ><GebaeudeVolumen bind:ausweis /></Bereich
> > -->
<!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden --> <!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden
<Bereich <Bereich
bereich="D" bereich="D"
title="Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden" title="Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden"
><Fensterflaechen bind:ausweis /></Bereich ><Fensterflaechen bind:ausweis /></Bereich
> > -->
<!-- E - Angabe zu Lüftung und Kühlung --> <!-- E - Angabe zu Lüftung und Kühlung -->
@@ -190,7 +190,7 @@
> >
<!-- F Angaben zur Heizungsanlage --> <!-- F Angaben zur Heizungsanlage -->
<!-- <Bereich bereich="D" title="Angaben zur Heizunganlage" <Bereich bereich="D" title="Angaben zur Heizunganlage"
><SanierungszustandHeizungsanlage ><SanierungszustandHeizungsanlage
bind:images={bilder} bind:images={bilder}
bind:objekt bind:objekt

View File

@@ -56,7 +56,7 @@
{#if ausweis.aufnahme.bilder.length > 0} {#if ausweis.aufnahme.bilder.length > 0}
<Carousel perPage={1}> <Carousel perPage={1}>
{#each ausweis.aufnahme.bilder as bild, i (i)} {#each ausweis.aufnahme.bilder as bild, i (i)}
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[15vh] h-full w-full object-contain"> <img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} loading="lazy" class="max-h-[15vh] h-full w-full object-contain">
{/each} {/each}
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span> <span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span> <span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>

View File

@@ -1,8 +1,9 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { transport } from "#lib/mail.js";
import { adminMiddleware } from "#lib/middleware/authorization.js"; import { adminMiddleware } from "#lib/middleware/authorization.js";
import { mollieClient } from "#lib/mollie.js"; import { mollieClient } from "#lib/mollie.js";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js"; import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
import { Prisma, prisma } from "#lib/server/prisma.js"; import { Benutzer, Prisma, prisma } from "#lib/server/prisma.js";
import { RefundStatus } from "@mollie/api-client"; import { RefundStatus } from "@mollie/api-client";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod"; import { z } from "zod";
@@ -35,6 +36,12 @@ export const PUT = defineApiRoute({
}) })
} }
const user = await prisma.benutzer.findUnique({
where: {
id: ausweis.benutzer_id as string
}
}) as Benutzer;
const response = await adapter.findUnique({ const response = await adapter.findUnique({
where: { where: {
id: input.ausweis_id id: input.ausweis_id
@@ -107,5 +114,38 @@ export const PUT = defineApiRoute({
}) })
} }
} }
await transport.sendMail({
from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: rechnung.email || user.email,
bcc: "info@online-energieausweis.org",
subject: `Stornierung des Energieausweises vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`,
html: `<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>
<p>Ihr Energieausweis wurde soeben storniert.
<br>
<p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
});
}, },
}) })

View File

@@ -36,6 +36,7 @@ if (user.rolle === Enums.BenutzerRolle.USER) {
}, },
include: { include: {
rechnung: true, rechnung: true,
benutzer: true,
aufnahme: { aufnahme: {
include: { include: {
bilder: true, bilder: true,
@@ -53,6 +54,7 @@ if (user.rolle === Enums.BenutzerRolle.USER) {
}, },
include: { include: {
rechnung: true, rechnung: true,
benutzer: true,
aufnahme: { aufnahme: {
include: { include: {
bilder: true, bilder: true,
@@ -70,7 +72,7 @@ if (!ausweis) {
--- ---
<UserLayout title="Objekte" {user}> <UserLayout title="Objekte" {user} besteller={ausweis.benutzer}>
<DashboardAufnahmeModule <DashboardAufnahmeModule
{ausweis} {ausweis}
benutzer={user} benutzer={user}

View File

@@ -54,3 +54,5 @@ if (!result) {
return Astro.redirect(`/dashboard/objekte/${result[0].id}?p=${page}`) return Astro.redirect(`/dashboard/objekte/${result[0].id}?p=${page}`)
--- ---
<script></script>