GEG Nachweis

This commit is contained in:
Moritz Utcke
2025-02-19 23:22:39 +11:00
parent 69566f1c74
commit faa8f2c673
38 changed files with 581 additions and 210 deletions

View File

@@ -4,16 +4,20 @@ export const createCaller = createCallerFactory({
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
"admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"),
"admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"),
"admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"),
"admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"),
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.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"),
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"geg-nachweis-verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/[uid].ts"),
"geg-nachweis-verbrauchsausweis-wohnen": await import("../src/pages/api/geg-nachweis-verbrauchsausweis-wohnen/index.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"geg-nachweis-wohnen/[uid]": await import("../src/pages/api/geg-nachweis-wohnen/[uid].ts"),
"geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-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"),
@@ -24,7 +28,8 @@ export const createCaller = createCallerFactory({
"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"),
"aufnahme/[uid]/bilder": await import("../src/pages/api/aufnahme/[uid]/bilder.ts"),
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid]/index.ts"),
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"),
"objekt/[uid]/unterlagen": await import("../src/pages/api/objekt/[uid]/unterlagen.ts"),
})

View File

@@ -104,12 +104,12 @@ export async function ausweisSpeichern(
continue;
}
const response = await api.objekt._uid.bilder.PUT.fetch({
const response = await api.aufnahme._uid.bilder.PUT.fetch({
base64: bild.base64,
kategorie: bild.kategorie
}, {
params: {
uid: objekt.uid
uid: aufnahme.uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`

View File

@@ -11,7 +11,7 @@ import Cookies from "js-cookie";
export async function bilderHochladen(
images: (UploadedGebaeudeBild & { base64?: string, update?: boolean })[],
gebaeude_uid: string
aufnahme_uid: string
) {
if (images.length == 0) {
return images;
@@ -57,12 +57,12 @@ export async function bilderHochladen(
}
});
} else {
const response = await api.objekt._uid.bilder.PUT.fetch({
const response = await api.aufnahme._uid.bilder.PUT.fetch({
base64: image.base64,
kategorie: image.kategorie as Enums.BilderKategorie
}, {
params: {
uid: gebaeude_uid
uid: aufnahme_uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`

View File

@@ -16,6 +16,7 @@
export let ausweisart: Enums.Ausweisart
async function ausweisAbschicken() {
loginAction = ausweisAbschicken
if (!await validateAccessTokenClient()) {
loginOverlayHidden = false;
return
@@ -35,7 +36,10 @@
}
}
let loginAction: () => any = ausweisAbschicken;
async function spaeterWeitermachen() {
loginAction = spaeterWeitermachen;
if (!await validateAccessTokenClient()) {
loginOverlayHidden = false;
return
@@ -51,6 +55,8 @@
"",
`${location.pathname}?uid=${ausweis.uid}`
);
window.location.href = `/speichern-erfolgreich?uid=${ausweis.uid}`
}
}
@@ -71,7 +77,7 @@
<div>
<Overlay bind:hidden={loginOverlayHidden}>
<div class="bg-white w-full max-w-screen-sm py-8">
<EmbeddedAuthFlowModule onLogin={ausweisAbschicken}></EmbeddedAuthFlowModule>
<EmbeddedAuthFlowModule onLogin={loginAction}></EmbeddedAuthFlowModule>
</div>
</Overlay>

View File

@@ -11,6 +11,7 @@ import {
Unterlage,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
GEGNachweisWohnen,
} from "@ibcornelsen/database/client";
import { z, ZodSchema } from "zod";
@@ -145,6 +146,8 @@ export function getAusweisartFromUUID(uid: string): Enums.Ausweisart | null {
return Enums.Ausweisart.BedarfsausweisWohnen
} else if (uid.startsWith("bag")) {
return Enums.Ausweisart.BedarfsausweisGewerbe
} else if (uid.startsWith("gnw")) {
return Enums.Ausweisart.GEGNachweisWohnen
}
return null;
@@ -167,4 +170,6 @@ export type AufnahmeKomplettClient = AufnahmeClient & {
bedarfsausweis_wohnen: BedarfsausweisWohnenClient[],
verbrauchsausweis_wohnen: VerbrauchsausweisWohnenClient[],
verbrauchsausweis_gewerbe: VerbrauchsausweisGewerbeClient[]
}
}
export type GEGNachweisWohnenClient = Omit<GEGNachweisWohnen, "id" | "aufnahme_id" | "benutzer_id">

View File

@@ -470,6 +470,17 @@
let bilderModal: HTMLDialogElement;
let infoVisible = false;
async function registriernummerAnfordern(uid: string) {
const result = await api.admin.registriernummer.GET.fetch({
uid
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
}
</script>
<div class="border rounded-lg bg-base-200">
@@ -817,9 +828,9 @@
xmlAbschicken(aufnahme.uid)
}}>X</button></td>
{/if}
{#if !aufnahme.registriernummer}
{#if !ausweis.registriernummer}
<td title="Registriernummer vom DiBT anfordern." class="w-4 p-1"><button class="btn btn-xs btn-ghost" on:click={() => {
registriernummerAnfordern(aufnahme.uid)
registriernummerAnfordern(ausweis.uid)
}}>R</button></td>
{/if}
</tr>

View File

@@ -6,6 +6,7 @@
export let objekt: ObjektKomplettClient;
// TODO
const objektBild = objekt.bilder.find(bild => bild.kategorie === Enums.BilderKategorie.Gebaeude);
</script>

View File

@@ -18,6 +18,7 @@ export enum VALID_UUID_PREFIXES {
"inv" = "Rechnung",
"tkt" = "Ticket",
"pln" = "Gebäude Plan",
"gnw" = "GEG Nachweis Wohnen"
}
/**
@@ -29,6 +30,7 @@ export const PRICES: Record<Enums.Ausweisart, [number, number, number]> = {
VerbrauchsausweisWohnen: [65, 95, 180],
VerbrauchsausweisGewerbe: [95, 125, 360],
BedarfsausweisGewerbe: [500, 700, 1000],
GEGNachweisWohnen: [500, 500, 500]
};
export const SERVICES: Record<

View File

@@ -4,10 +4,16 @@ import { prisma } from "@ibcornelsen/database/server";
import { APIError, TypesafeAPIContextWithRequest } from "astro-typesafe-api/server";
import { z } from "zod";
export async function authorizationMiddleware(input: any, context: TypesafeAPIContextWithRequest<any>) {
const authorization: string | undefined = context.request.headers.get("Authorization");
export async function checkAuthorizationHeaderNoThrow(authorization: string): Promise<ReturnType<typeof checkAuthorizationHeader> | null> {
try {
return await checkAuthorizationHeader(authorization)
} catch(e) {
return null
}
}
if (!context.request.headers.has("Authorization") || !authorization) {
export async function checkAuthorizationHeader(authorization: string) {
if (!authorization) {
throw new APIError({
code: "BAD_REQUEST",
message: "Request is missing an 'Authorization' header."
@@ -81,6 +87,10 @@ export async function authorizationMiddleware(input: any, context: TypesafeAPICo
})
}
export async function authorizationMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
return await checkAuthorizationHeader(ctx.request.headers.get("Authorization"));
}
export async function maybeAuthorizationMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
try {
return authorizationMiddleware(input, ctx)
@@ -93,7 +103,7 @@ export const authorizationHeaders = {
Authorization: z.string()
}
export async function adminMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
export async function adminMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
try {
const user = await authorizationMiddleware(input, ctx)

View File

@@ -67,6 +67,10 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
}
if (aufnahme.durchlauf_erhitzer && !ausweis.warmwasser_enthalten) {
fillFormField("energietraeger_warmwasser", "Strommix");
}
toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
@@ -426,7 +430,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
}
if (ausweis.wird_gekuehlt) {
if (aufnahme.kuehlung) {
/**
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
* Primärenergiefaktor Strom

18
src/lib/server/ausweis.ts Normal file
View File

@@ -0,0 +1,18 @@
import { getAusweisartFromUUID } from "#components/Ausweis/types.js";
import { Enums, prisma } from "@ibcornelsen/database/server";
/**
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
* @param uid Die Ausweis UID
*/
export function getPrismaAusweisAdapter(uid: string) {
const ausweisart = getAusweisartFromUUID(uid);
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
return prisma.verbrauchsausweisWohnen
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
return prisma.verbrauchsausweisGewerbe
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
return prisma.bedarfsausweisWohnen
}
}

9
src/lib/server/user.ts Normal file
View File

@@ -0,0 +1,9 @@
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { checkAuthorizationHeader, checkAuthorizationHeaderNoThrow } from "#lib/middleware/authorization.js";
import { AstroGlobal } from "astro";
export function getCurrentUser(Astro: AstroGlobal) {
const accessToken = Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
return checkAuthorizationHeaderNoThrow(`Bearer ${accessToken}`)
}

View File

@@ -10,14 +10,16 @@
<h1 class="text-4xl font-medium mb-8">{objekt.adresse}</h1>
<Carousel perPage={1}>
{#each objekt.bilder as bild, i (i)}
<img src="/bilder/{bild.uid}.webp" alt={bild.kategorie} class="max-h-[60vh] h-full w-full object-contain">
{/each}
<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>
</Carousel>
<div class="bg-white rounded-lg">
<Carousel perPage={1}>
{#each objekt.bilder as bild, i (i)}
<img src="/bilder/{bild.uid}.webp" alt={bild.kategorie} class="max-h-[60vh] h-full w-full object-contain">
{/each}
<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>
</Carousel>
</div>
<div class="my-8 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
{#each objekt.aufnahmen as aufnahme}

View File

@@ -71,11 +71,7 @@
export let bezahlmethode: Bezahlmethoden =
Enums.Bezahlmethoden.paypal;
let prices: number[] = [];
if (aufnahme.ausweisart) {
prices = PRICES[aufnahme.ausweisart];
}
let prices = PRICES[ausweisart];
let basePrice: number = prices[0];
@@ -91,6 +87,7 @@
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: `/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`,
[Enums.Ausweisart.BedarfsausweisWohnen]: `/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`,
[Enums.Ausweisart.BedarfsausweisGewerbe]: `/energieausweis-erstellen/bedarfsausweis-gewerbe?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisWohnen]: `/angebot-anfragen/geg-nachweis-wohnen-anfragen?uid=${ausweis.uid}`,
}[ausweisart]
async function speichern(e: SubmitEvent) {
@@ -169,6 +166,7 @@
bestellenNichtMoeglich = true
}
const gegAnfrage = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) || (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe)
</script>
<div
@@ -178,7 +176,7 @@
2xl:grid-cols-2 2xl:gap-x-8
"
>
{#if !ausweis.geg_anfrage}
{#if !gegAnfrage}
<div id="performance-box" class="w-full box relative px-4 order-1 self-stretch grid grid-cols-1">
<PerformanceScore
bind:ausweis
@@ -195,9 +193,9 @@
>
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
<h2 class="text-primary text-xl">
Verbrauchsausweis Wohnen {PRICES.VerbrauchsausweisWohnen[0]}
{ausweisart} {prices[0]}
</h2>
{#if ausweis.geg_anfrage}
{#if gegAnfrage}
<Progressbar active={1} steps={["Gebäudedaten", "Kundendaten", "Bestätigung"]}/>
{:else}
<Progressbar active={1}/>
@@ -218,7 +216,7 @@
<Rechnungsadresse bind:user bind:rechnung /></Bereich
>
{#if !ausweis.geg_anfrage}
{#if !gegAnfrage}
<Bereich bereich="3" title="Bezahlmethode">
<Bezahlung bind:selectedPaymentType={bezahlmethode} /></Bereich
>
@@ -296,7 +294,7 @@
<button class="button">Speichern</button>
{#if ausweis.geg_anfrage}
{#if gegAnfrage}
<button class="button cursor-pointer" data-cy="bestellen" on:click={anfordern} >Angebot anfordern</button>
{:else}
<button class="button cursor-pointer" data-cy="bestellen" on:click={bestellen} >Kostenpflichtig bestellen</button>

View File

@@ -8,8 +8,7 @@
BenutzerClient,
UploadedGebaeudeBild,
UnterlageClient,
BedarfsausweisWohnenClient,
VerbrauchsausweisGewerbeClient,
GEGNachweisWohnenClient,
} from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte";
import { Enums } from "@ibcornelsen/database/client";
@@ -26,12 +25,11 @@
import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie";
export async function ausweisSpeichern(
ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,
export async function nachweisSpeichern(
nachweis: GEGNachweisWohnenClient,
objekt: ObjektClient,
aufnahme: AufnahmeClient,
unterlagen: (UnterlageClient & { data?: string })[],
ausweisart: Enums.Ausweisart
unterlagen: (UnterlageClient & { data?: string })[]
) {
if (objekt.uid) {
await api.objekt._uid.PATCH.fetch({
@@ -82,36 +80,21 @@
aufnahme.uid = uid
}
let patchRoute: any;
let putRoute: any;
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
patchRoute = api["verbrauchsausweis-wohnen"]._uid.PATCH
putRoute = api["verbrauchsausweis-wohnen"].PUT
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
patchRoute = api["verbrauchsausweis-gewerbe"]._uid.PATCH
putRoute = api["verbrauchsausweis-gewerbe"].PUT
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
patchRoute = api["bedarfsausweis-wohnen"]._uid.PATCH
putRoute = api["bedarfsausweis-wohnen"].PUT
} else if (ausweisart == Enums.Ausweisart.GEGNachweisVerbrauchsausweisWohnen) {
patchRoute = api["geg-nachweis-verbrauchsausweis-wohnen"]._uid.PATCH
putRoute = api["geg-nachweis-verbrauchsausweis-wohnen"].PUT
}
if (nachweis.uid) {
await api["geg-nachweis-wohnen"]._uid.PATCH.fetch({
if (ausweis.uid) {
await patchRoute.fetch({
...exclude(ausweis, ["uid"])
...exclude(nachweis, ["uid"])
}, {
params: {
uid: ausweis.uid
uid: nachweis.uid
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { uid } = await putRoute.fetch({
ausweis,
const { uid } = await api["geg-nachweis-wohnen"].PUT.fetch({
nachweis: nachweis,
uid_aufnahme: aufnahme.uid
}, {
headers: {
@@ -119,7 +102,7 @@
}
})
ausweis.uid = uid;
nachweis.uid = uid;
}
for (const unterlage of unterlagen) {
@@ -145,20 +128,20 @@
}
return {
uid_ausweis: ausweis.uid,
uid_ausweis: nachweis.uid,
uid_aufnahme: aufnahme.uid,
uid_objekt: objekt.uid
}
}
async function ausweisAbschicken() {
async function nachweisAbschicken() {
if (!(await validateAccessTokenClient())) {
loginOverlayHidden = false;
return;
}
const result = await ausweisSpeichern(ausweis, objekt, aufnahme, unterlagen, Enums.Ausweisart.GEGNachweisVerbrauchsausweisWohnen)
const result = await nachweisSpeichern(nachweis, objekt, aufnahme, unterlagen)
if (result !== null) {
window.history.pushState(
@@ -183,7 +166,7 @@
let loginOverlayHidden = true;
export let ausweis: VerbrauchsausweisWohnenClient;
export let nachweis: GEGNachweisWohnenClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let user: BenutzerClient = {} as BenutzerClient;
@@ -195,10 +178,10 @@
})[] = [];
if (Object.keys(ausweis).length === 0) {
if (Object.keys(nachweis).length === 0) {
const localStorageAusweis = localStorage.getItem("ausweis");
if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis)
nachweis = JSON.parse(localStorageAusweis)
}
}
@@ -218,20 +201,18 @@
$: {
if (ausweis.uid && objekt.uid && aufnahme.uid) {
localStorage.setItem(ausweis.uid, JSON.stringify(ausweis))
if (nachweis.uid && objekt.uid && aufnahme.uid) {
localStorage.setItem(nachweis.uid, JSON.stringify(nachweis))
localStorage.setItem(objekt.uid, JSON.stringify(objekt))
localStorage.setItem(aufnahme.uid, JSON.stringify(aufnahme))
} else {
localStorage.setItem("ausweis", JSON.stringify(ausweis))
localStorage.setItem("ausweis", JSON.stringify(nachweis))
localStorage.setItem("aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("objekt", JSON.stringify(objekt))
}
}
const ausweisart = Enums.Ausweisart.GEGNachweisVerbrauchsausweisWohnen;
function automatischAusfüllen() {}
</script>
<div
@@ -253,7 +234,7 @@
<form
id="formInput-1"
on:submit={ausweisAbschicken}
on:submit={nachweisAbschicken}
name="ausweis"
data-test="ausweis"
>
@@ -261,7 +242,7 @@
<!-- A Prüfung der Ausweisart -->
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart bind:objekt bind:aufnahme bind:ausweis {ausweisart} />
<Ausweisart bind:objekt bind:aufnahme bind:ausweis={nachweis} {ausweisart} />
</Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
@@ -279,7 +260,7 @@
title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw."
></InputLabel>
<textarea class="rounded-e-none" rows="10" bind:value={ausweis.beschreibung}></textarea>
<textarea class="rounded-e-none" rows="10" bind:value={nachweis.beschreibung}></textarea>
<div class="help-label">
<HelpLabel>
@@ -317,7 +298,7 @@
min={1}
name={"plaene"}
bind:files={plaene}
bind:ausweis
bind:ausweis={nachweis}
bind:objekt
></FileGrid>
</div>
@@ -343,7 +324,7 @@
min={0}
name={"unterlagen"}
bind:files={unterlagen}
bind:ausweis
bind:ausweis={nachweis}
bind:objekt
></FileGrid>
</div>
@@ -365,13 +346,13 @@
<div>
<Overlay bind:hidden={loginOverlayHidden}>
<div class="bg-white w-full max-w-screen-sm py-8">
<EmbeddedAuthFlowModule onLogin={ausweisAbschicken}
<EmbeddedAuthFlowModule onLogin={nachweisAbschicken}
></EmbeddedAuthFlowModule>
</div>
</Overlay>
<button
on:click={ausweisAbschicken}
on:click={nachweisAbschicken}
type="button"
class="button"
data-cy="weiter">Weiter</button

View File

@@ -1,13 +1,13 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { AufnahmeClient, GEGNachweisWohnenClient, ObjektClient, UploadedGebaeudeBild } from "#components/Ausweis/types";
import { createCaller } from "../../astro-typesafe-api-caller.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
import GEGNachweisVerbrauchsausweisWohnenModule from "#modules/angebot-anfragen/GEGNachweisVerbrauchsausweisWohnenModule.svelte";
import GEGNachweisWohnenModule from "#modules/angebot-anfragen/GEGNachweisWohnenModule.svelte";
const uid = Astro.url.searchParams.get("uid");
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
let nachweis: GEGNachweisWohnenClient = {} as GEGNachweisWohnenClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: UploadedGebaeudeBild[] = []
@@ -24,7 +24,7 @@ if (uid) {
}
try {
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, {
nachweis = await caller["geg-nachweis-wohnen"]._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
@@ -38,7 +38,7 @@ if (uid) {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_aufnahme
uid: nachweis.uid_aufnahme
}
})
@@ -47,34 +47,34 @@ if (uid) {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
uid: nachweis.uid_objekt
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
uid: nachweis.uid_aufnahme
}
})
if (!ausweis) {
if (!nachweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
"/angebot-anfragen/geg-nachweis-wohnen-anfragen"
);
}
} catch(e) {
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohnen"
"/angebot-anfragen/geg-nachweis-wohnen-anfragen"
);
}
}
---
<AusweisLayout title="Verbrauchsausweis erstellen">
<GEGNachweisVerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} />
<AusweisLayout title="GEG Nachweis Wohnen anfragen">
<GEGNachweisWohnenModule client:only {nachweis} {objekt} {aufnahme} {bilder} />
</AusweisLayout>

View File

@@ -88,7 +88,7 @@ export const GET = defineApiRoute({
ausweis,
ausweis.aufnahme,
ausweis.aufnahme.objekt,
ausweis.aufnahme.objekt.bilder,
ausweis.aufnahme.bilder,
ausweis.aufnahme.objekt.benutzer
);
const pdfDatenblatt = await pdfDatenblattVerbrauchsausweisWohnen(

View File

View File

View File

View File

@@ -0,0 +1,229 @@
import {
getAusweisartFromUUID,
UUidWithPrefix,
} from "#components/Ausweis/types.js";
import {
adminMiddleware,
authorizationHeaders,
} from "#lib/middleware/authorization.js";
import {
BedarfsausweisWohnen,
Enums,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
} from "@ibcornelsen/database/client";
import { prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import moment from "moment";
import { z } from "zod";
import soap from "soap";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
export const GET = defineApiRoute({
input: z.object({
uid: UUidWithPrefix,
}),
headers: authorizationHeaders,
middleware: adminMiddleware,
async fetch({ uid }, context, user) {
const ausweisart = getAusweisartFromUUID(uid);
const adapter = getPrismaAusweisAdapter(
uid
) as typeof prisma.verbrauchsausweisWohnen;
if (!adapter) {
throw new APIError({
code: "BAD_REQUEST",
message: "UID ist ungültig.",
});
}
const ausweis = await adapter.findUnique({
where: {
uid,
},
include: {
aufnahme: {
include: {
objekt: true,
},
},
},
});
if (!ausweis) {
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis existiert nicht.",
});
}
if (ausweis.registriernummer) {
throw new APIError({
code: "PRECONDITION_FAILED",
message: `Ausweis hat bereits eine Registriernummer: (${ausweis.registriernummer})`,
});
}
if (!ausweis.aufnahme.objekt.plz) {
throw new APIError({
code: "PRECONDITION_FAILED",
message: "Ausweis Gebäude hat keine Postleitzahl",
});
}
const postleitzahl = await prisma.postleitzahlen.findFirst({
where: {
plz: ausweis.aufnahme.objekt.plz,
},
});
if (!postleitzahl) {
throw new APIError({
code: "PRECONDITION_FAILED",
message: `Bundesland konnte nicht gefunden werden für PLZ ${ausweis.aufnahme.objekt.plz}`,
});
}
/* Authentifizierung */
const Aussteller_ID_DIBT = "jens.cornelsen@ib-cornelsen.de";
const Aussteller_PWD_DIBT = "62465E79F6A61F31C4DCA9E2AF788DD3";
/* EnEV-Nachweis */
const Ausstellungsdatum = moment(
ausweis.aufnahme.erstellungsdatum
).format("DD.MM.YYYY");
const Gesetzesgrundlage = "GEG-2024";
/* EnergieausweisDaten */
let gebaeudeart: string = "";
if (
ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe &&
ausweis.aufnahme.gebaeudeteil == "Gewerbe"
) {
gebaeudeart = "Nichtwohnteil gemischt genutztes Gebäude";
} else if (
(ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen ||
ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) &&
ausweis.aufnahme.gebaeudeteil == "Wohnen"
) {
gebaeudeart = "Wohnteil gemischt genutztes Gebäude";
} else if (
(ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen ||
ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) &&
ausweis.aufnahme.gebaeudeteil == "Gesamtgebäude"
) {
gebaeudeart = "Wohngebäude";
} else if (
ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe &&
ausweis.aufnahme.gebaeudeteil == "Gesamtgebäude"
) {
gebaeudeart = "Nichtwohngebäude";
}
const art: string =
ausweisart == Enums.Ausweisart.BedarfsausweisWohnen
? "Energiebedarfsausweis"
: "Energieverbrauchsausweis";
const body = `<Datenregistratur xmlns="http://energieausweis.dibt.de/WebServiceEnergie/DibtEnergieAusweisService">
<doc>
<root>
<Authentifizierung>
<Aussteller_ID_DIBT>${Aussteller_ID_DIBT}</Aussteller_ID_DIBT>
<Aussteller_PWD_DIBT>${Aussteller_PWD_DIBT}</Aussteller_PWD_DIBT>
</Authentifizierung>
<EnEV-Nachweis>
<Ausstellungsdatum>${Ausstellungsdatum}</Ausstellungsdatum>
<Bundesland>${postleitzahl.bundesland}</Bundesland>
<Postleitzahl>${postleitzahl.plz}</Postleitzahl>
<Gesetzesgrundlage>${Gesetzesgrundlage}</Gesetzesgrundlage>
</EnEV-Nachweis>
<Energieausweis-Daten>
<Gebaeudeart>${gebaeudeart}</Gebaeudeart>
<Art>${art}</Art>
<Neubau>${
ausweis.ausstellgrund ===
Enums.Ausstellgrund.Neubau
? "1"
: "0"
}</Neubau>
</Energieausweis-Daten>
</root>
</doc>
</Datenregistratur>`;
return await new Promise(async (resolve, reject) => {
soap.createClient(
"https://energieausweis.dibt.de/published/WebServiceEnergieausweis/DibtEnergieAusweisServiceEx01.wsdl",
{},
function (err, client) {
if (err !== null) {
throw new APIError({
code: "INTERNAL_SERVER_ERROR",
message: err,
});
}
client.Datenregistratur(
body,
async function (
err: any,
result: {
DatenregistraturResult: {
WEB_Service_Antwort: {
Rueckgabewert?: null;
Registriernummer: string;
Datendatei: any;
};
};
}
) {
if (err !== null) {
reject({
code: "INTERNAL_SERVER_ERROR",
message: err,
});
}
if (
result.DatenregistraturResult
.WEB_Service_Antwort.Registriernummer
) {
await (
adapter as typeof prisma.verbrauchsausweisWohnen
).update({
where: {
uid,
},
data: {
registriernummer:
result.DatenregistraturResult
.WEB_Service_Antwort
.Registriernummer,
kontrolldatei_angefragt: result
.DatenregistraturResult
.WEB_Service_Antwort.Datendatei
? true
: false,
},
});
resolve(
result.DatenregistraturResult
.WEB_Service_Antwort.Registriernummer
);
} else {
reject({
code: "INTERNAL_SERVER_ERROR",
message: "Unerwarteter Rückgabewert.",
});
}
}
);
}
);
}).catch((reason) => {
throw new APIError(reason);
});
},
});

View File

@@ -26,14 +26,14 @@ export const PUT = defineApiRoute({
});
}
let objekt = await prisma.objekt.findUnique({
let aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: ctx.params.uid,
benutzer_id: user.id
},
});
if (!objekt) {
if (!aufnahme) {
throw new APIError({
code: "NOT_FOUND",
message: "Objekt nicht gefunden oder gehört einem anderen Benutzer.",
@@ -46,12 +46,12 @@ export const PUT = defineApiRoute({
);
const buffer = Buffer.from(dataWithoutPrefix, "base64");
const bild = await prisma.Bild.create({
const bild = await prisma.bild.create({
data: {
kategorie: input.kategorie,
objekt: {
aufnahme: {
connect: {
id: objekt.id,
id: aufnahme.id,
},
},
},
@@ -69,10 +69,8 @@ export const PUT = defineApiRoute({
writeFileSync(filePath, buffer)
} catch(e) {
console.log(e);
// Bild wurde nicht gespeichert, wir löschen den Eintrag wieder
await prisma.Bild.delete({
await prisma.bild.delete({
where: {
uid: bild.uid
}
@@ -99,7 +97,7 @@ export const GET = defineApiRoute({
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const objekt = await prisma.objekt.findUnique({
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid,
benutzer_id: user.id
@@ -115,13 +113,13 @@ export const GET = defineApiRoute({
}
})
if (!objekt) {
if (!aufnahme) {
throw new APIError({
code: "FORBIDDEN",
message: "Objekt existiert nicht oder gehört einem anderen Benutzer."
})
}
return objekt.bilder
return aufnahme.bilder
},
})

View File

@@ -1,12 +1,12 @@
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { BedarfsausweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
import { GEGNachweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const PATCH = defineApiRoute({
input: BedarfsausweisWohnenSchema.omit({
input: GEGNachweisWohnenSchema.omit({
uid: true,
id: true,
benutzer_id: true,
@@ -18,7 +18,7 @@ export const PATCH = defineApiRoute({
},
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const objekt = await prisma.bedarfsausweisWohnen.findUnique({
const objekt = await prisma.gEGNachweisWohnen.findUnique({
where: {
uid: ctx.params.uid,
benutzer: {
@@ -30,11 +30,11 @@ export const PATCH = defineApiRoute({
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
})
}
await prisma.bedarfsausweisWohnen.update({
await prisma.gEGNachweisWohnen.update({
where: {
uid: ctx.params.uid
},
@@ -45,7 +45,7 @@ export const PATCH = defineApiRoute({
export const DELETE = defineApiRoute({
meta: {
description: "Storniert einen Ausweis"
description: "Storniert einen Nachweis"
},
headers: authorizationHeaders,
middleware: authorizationMiddleware,
@@ -59,70 +59,63 @@ export const DELETE = defineApiRoute({
})
}
// Wir holen uns den Bedarfsausweis
// Wir holen uns den BedarfsNachweis
// Dieser MUSS mit dem Nutzer verknüpft sein.
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
const nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: {
uid,
},
include: {
aufnahme: {
select: {
storniert: true
}
}
}
});
if (!ausweis) {
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
if (!nachweis) {
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis konnte nicht gefunden werden.",
message: "Nachweis konnte nicht gefunden werden.",
});
}
// Wir dürfen den Ausweis nur stornieren, wenn er noch nicht ausgestellt wurde
// Außerdem müssen wir schauen, ob wir Admin oder der Besitzer des Ausweises sind.
if ((ausweis.benutzer_id !== user.id) && user.rolle !== "ADMIN") {
// Falls der Ausweis nicht dem Nutzer gehört, werfen wir einen Fehler
// Wir dürfen den Nachweis nur stornieren, wenn er noch nicht ausgestellt wurde
// Außerdem müssen wir schauen, ob wir Admin oder der Besitzer des Nachweises sind.
if ((nachweis.benutzer_id !== user.id) && user.rolle !== "ADMIN") {
// Falls der Nachweis nicht dem Nutzer gehört, werfen wir einen Fehler
throw new APIError({
code: "FORBIDDEN",
message: "Ausweis gehört nicht dem Nutzer.",
message: "Nachweis gehört nicht dem Nutzer.",
});
}
// if (ausweis.erledigt) {
// // Falls der Ausweis bereits ausgestellt wurde, werfen wir einen Fehler
// if (Nachweis.erledigt) {
// // Falls der Nachweis bereits ausgestellt wurde, werfen wir einen Fehler
// throw new TRPCError({
// code: "BAD_REQUEST",
// message: "Ausweis wurde bereits ausgestellt.",
// message: "Nachweis wurde bereits ausgestellt.",
// });
// }
if (ausweis.aufnahme.storniert) {
// Falls der Ausweis bereits storniert ist, werfen wir einen Fehler
if (nachweis.storniert) {
// Falls der Nachweis bereits storniert ist, werfen wir einen Fehler
throw new APIError({
code: "BAD_REQUEST",
message: "Ausweis wurde bereits storniert.",
message: "Nachweis wurde bereits storniert.",
});
}
await prisma.aufnahme.update({
await prisma.gEGNachweisWohnen.update({
where: {
id: ausweis.aufnahme_id
id: nachweis.id
},
data: {
storniert: true
}
})
// Wir erstellen ein Event, dass der Ausweis storniert wurde
// Wir erstellen ein Event, dass der Nachweis storniert wurde
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
title: "Ausweis storniert",
description: ((user.rolle === "ADMIN") && (ausweis.benutzer_id !== user.id)) ? "Ausweis wurde von einem Administrator storniert." : "Ausweis wurde vom Besitzer storniert.",
title: "Nachweis storniert",
description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.",
benutzer: {
connect: {
id: user.id
@@ -130,7 +123,7 @@ export const DELETE = defineApiRoute({
},
aufnahme: {
connect: {
id: ausweis.aufnahme_id
id: nachweis.aufnahme_id
}
}
}
@@ -155,7 +148,7 @@ export const GET = defineApiRoute({
}
}
},
output: ZodOverlap<OptionalNullable<BedarfsausweisWohnenClient>>(BedarfsausweisWohnenSchema.merge(z.object({
output: ZodOverlap<OptionalNullable<GEGNachweisWohnenClient>>(GEGNachweisWohnenSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
@@ -175,7 +168,7 @@ export const GET = defineApiRoute({
})
}
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
const Nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: {
uid,
benutzer_id: user.id
@@ -199,19 +192,19 @@ export const GET = defineApiRoute({
}
});
if (!ausweis) {
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
if (!Nachweis) {
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis konnte nicht gefunden werden.",
message: "Nachweis konnte nicht gefunden werden.",
});
}
return {
uid_aufnahme: ausweis.aufnahme.uid,
uid_objekt: ausweis.aufnahme.objekt.uid,
uid_benutzer: ausweis.benutzer?.uid,
...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
uid_aufnahme: Nachweis.aufnahme.uid,
uid_objekt: Nachweis.aufnahme.objekt.uid,
uid_benutzer: Nachweis.benutzer?.uid,
...exclude(Nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
}
},
});

View File

@@ -1,6 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { BedarfsausweisWohnenSchema, prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server";
import { GEGNachweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
@@ -12,7 +12,7 @@ export const PUT = defineApiRoute({
tags: ["GEG Nachweis", "Verbrauchsausweis Wohnen"],
},
input: z.object({
ausweis: VerbrauchsausweisWohnenSchema.omit({
nachweis: GEGNachweisWohnenSchema.omit({
id: true,
benutzer_id: true,
uid: true,
@@ -41,40 +41,39 @@ export const PUT = defineApiRoute({
})
}
const createdAusweis = await prisma.verbrauchsausweisWohnen.create({
data: {
...input.ausweis,
benutzer: {
connect: {
id: user.id,
},
const nachweis = await prisma.gEGNachweisWohnen.create({
data: {
...input.nachweis,
benutzer: {
connect: {
id: user.id,
},
aufnahme: {
connect: {
uid: aufnahme.uid,
},
},
geg_anfrage: true
},
select: {
uid: true,
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true,
},
aufnahme: {
connect: {
id: aufnahme.id,
},
}
},
select: {
uid: true,
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true,
},
},
},
},
});
},
});
return {
uid: createdAusweis.uid,
objekt_uid: createdAusweis.aufnahme.objekt.uid,
aufnahme_uid: createdAusweis.aufnahme.uid,
uid: nachweis.uid,
objekt_uid: nachweis.aufnahme.objekt.uid,
aufnahme_uid: nachweis.aufnahme.uid,
};
},
});
@@ -108,11 +107,6 @@ export const GET = defineApiRoute({
benutzer: true,
aufnahme: {
include: {
objekt: {
include: {
bilder: true,
},
},
rechnungen: true,
events: {
include: {

View File

@@ -7,7 +7,7 @@ import { writeFileSync } from "fs";
export const PUT = defineApiRoute({
input: UnterlageSchema.omit({
objekt_id: true,
aufnahme_id: true,
id: true,
uid: true
}).merge(z.object({
@@ -25,14 +25,14 @@ export const PUT = defineApiRoute({
})
}
let objekt = await prisma.objekt.findUnique({
let aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: ctx.params.uid,
benutzer_id: user.id
},
});
if (!objekt) {
if (!aufnahme) {
throw new APIError({
code: "NOT_FOUND",
message: "Objekt nicht gefunden oder gehört einem anderen Benutzer.",
@@ -44,9 +44,9 @@ export const PUT = defineApiRoute({
const unterlage = await prisma.unterlage.create({
data: {
kategorie: kategorie,
objekt: {
aufnahme: {
connect: {
id: objekt.id,
id: aufnahme.id,
},
},
},
@@ -88,7 +88,7 @@ export const GET = defineApiRoute({
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const objekt = await prisma.objekt.findUnique({
const objekt = await prisma.aufnahme.findUnique({
where: {
uid,
benutzer_id: user.id

View File

@@ -49,7 +49,7 @@ const reformedAusweise = ausweise.map(ausweis => ({
ausweis: omit(ausweis, ["aufnahme"]) as VerbrauchsausweisWohnenClient,
aufnahme: omit(omit(ausweis.aufnahme, ["events"]), ["objekt"]) as AufnahmeClient,
objekt: omit(ausweis.aufnahme.objekt, ["bilder"]) as ObjektClient,
bilder: ausweis.aufnahme.objekt.bilder as unknown as UploadedGebaeudeBild[],
bilder: ausweis.aufnahme.bilder as unknown as UploadedGebaeudeBild[],
events: ausweis.aufnahme.events
}))
---

View File

@@ -52,12 +52,12 @@ if (uid) {
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
uid: ausweis.uid_aufnahme
}
})

View File

@@ -54,12 +54,12 @@ if (uid) {
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_objekt
uid: uid_aufnahme
}
})

View File

@@ -51,12 +51,12 @@ if (uid) {
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
uid: ausweis.uid_aufnahme
}
})

View File

@@ -51,12 +51,12 @@ if (uid) {
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
uid: ausweis.uid_aufnahme
}
})

View File

@@ -51,12 +51,12 @@ if (uid) {
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
uid: ausweis.uid_aufnahme
}
})

View File

@@ -51,12 +51,12 @@ if (uid) {
}
})
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
uid: ausweis.uid_aufnahme
}
})

View File

@@ -49,6 +49,15 @@ if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
uid
}
})
} else if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
ausweis = await caller["geg-nachweis-wohnen"]._uid.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
})
} else {
return Astro.redirect("/404")
}
@@ -80,8 +89,6 @@ const user = await caller.user.self.GET.fetch(undefined, {
aufnahme.ausweisart = "VerbrauchsausweisWohnen"
if (!ausweis || !user) {
return Astro.redirect("/404");
}

View File

@@ -0,0 +1,52 @@
---
import Layout from "#layouts/Layout.astro";
import { BASE_URI } from "#lib/constants";
import { transport } from "#lib/mail";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
import { getCurrentUser } from "#lib/server/user";
const user = await getCurrentUser(Astro)
const uid = Astro.url.searchParams.get("uid");
const adapter = getPrismaAusweisAdapter(uid || "")
console.log(user, uid);
if (!user || !uid || !adapter) {
return Astro.redirect("/")
}
const ausweis = await adapter.findUnique({
where: {
uid
}
})
if (!ausweis) {
return Astro.redirect("/")
}
transport.sendMail({
from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email,
subject: `Ihr Ausweis wurde gespeichert - IBCornelsen.`,
text: `Sehr geehrte/r ${user.name},
Ihr Energieausweis wurde erfolgreich in Ihrem Konto gespeichert. Sie können ihn jederzeit in Ihrem Kundenbereich abrufen.
Zum Download oder zur Verwaltung Ihrer Ausweise besuchen Sie bitte:
${BASE_URI}/dashboard
Falls Sie Fragen haben, stehen wir Ihnen gerne zur Verfügung.
Mit freundlichen Grüßen
Ihr IBCornelsen`
})
---
<Layout title="Speichern Erfolgreich">
<h1>Ihr Energieausweis wurde gespeichert</h1>
<p>Ihr Energieausweis wurde erfolgreich in Ihrem Konto gespeichert. Sie können ihn jederzeit in Ihrem Kundenbereich abrufen.</p>
<a href="/dashboard">👉 Jetzt ansehen</a>
<p>Falls Sie Fragen haben, steht unser Support-Team Ihnen gerne zur Verfügung.</p>
</Layout>