Revert "Bugfixes"

This commit is contained in:
Moritz Utcke
2025-04-09 19:25:21 -04:00
committed by GitHub
parent 53ea51885a
commit 4f382c150d
46 changed files with 325 additions and 482 deletions

View File

@@ -96,7 +96,7 @@
"postcss-import": "^16.1.0", "postcss-import": "^16.1.0",
"postcss-nesting": "^13.0.1", "postcss-nesting": "^13.0.1",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"prisma": "6.4.1", "prisma": "^6.4.1",
"prisma-dbml-generator": "^0.12.0", "prisma-dbml-generator": "^0.12.0",
"prisma-generator-fake-data": "^0.14.3", "prisma-generator-fake-data": "^0.14.3",
"tsx": "^4.19.3", "tsx": "^4.19.3",

View File

@@ -1,17 +0,0 @@
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisGewerbe';
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisWohnen';
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisGewerbe';
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisWohnen';
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisGewerbe';
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisWohnen';

View File

@@ -26,7 +26,6 @@ model BedarfsausweisGewerbe {
klimatisierung Boolean? @default(false) klimatisierung Boolean? @default(false)
nachweistyp AusweisTyp @default(Standard) nachweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(BedarfsausweisGewerbe)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -100,7 +100,6 @@ model BedarfsausweisWohnen {
pruefpunkt_fenster Boolean? @default(false) pruefpunkt_fenster Boolean? @default(false)
ausweistyp AusweisTyp @default(Standard) ausweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(BedarfsausweisWohnen)
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)

View File

@@ -17,7 +17,6 @@ model GEGNachweisGewerbe {
beschreibung String? @db.Text beschreibung String? @db.Text
nachweistyp AusweisTyp @default(Standard) nachweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(GEGNachweisGewerbe)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -17,7 +17,6 @@ model GEGNachweisWohnen {
beschreibung String? @db.Text beschreibung String? @db.Text
nachweistyp AusweisTyp @default(Standard) nachweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(GEGNachweisWohnen)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -74,7 +74,6 @@ model VerbrauchsausweisGewerbe {
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())
ausweistyp AusweisTyp @default(Standard) ausweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(VerbrauchsausweisGewerbe)
pruefpunkt_heizungsalter Boolean? @default(false) pruefpunkt_heizungsalter Boolean? @default(false)
pruefpunkt_verbrauch_niedrig Boolean? @default(false) pruefpunkt_verbrauch_niedrig Boolean? @default(false)

View File

@@ -75,7 +75,6 @@ model VerbrauchsausweisWohnen {
kontrolldatei_angefragt Boolean? @default(false) kontrolldatei_angefragt Boolean? @default(false)
ausweistyp AusweisTyp @default(Standard) ausweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(VerbrauchsausweisWohnen)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -1,4 +1,5 @@
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { import {
@@ -565,7 +566,7 @@ export async function ausweisSpeichern(
return; return;
} }
aufnahme.id = aufnahme_id as string; aufnahme.id = aufnahme_id;
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
const id = await verbrauchsausweisWohnenSpeichern( const id = await verbrauchsausweisWohnenSpeichern(

View File

@@ -1,4 +1,5 @@
<script lang="ts"> <script lang="ts">
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte"; import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte";
import { import {
BedarfsausweisWohnenClient, BedarfsausweisWohnenClient,
@@ -8,9 +9,8 @@
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
import { Enums } from "#lib/client/prisma.js"; import { Enums } from "#lib/client/prisma";
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js"; import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
@@ -21,9 +21,7 @@
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000, [Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000,
[Enums.Ausweisart.VerbrauchsausweisWohnen]: 250, [Enums.Ausweisart.VerbrauchsausweisWohnen]: 250,
[Enums.Ausweisart.BedarfsausweisWohnen]: 250, [Enums.Ausweisart.BedarfsausweisWohnen]: 250,
[Enums.Ausweisart.BedarfsausweisGewerbe]: 0, [Enums.Ausweisart.BedarfsausweisGewerbe]: 250
[Enums.Ausweisart.GEGNachweisGewerbe]: 0,
[Enums.Ausweisart.GEGNachweisWohnen]: 0,
}[ausweisart]; }[ausweisart];
/** /**
@@ -66,9 +64,9 @@
(async () => { (async () => {
let result; let result;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
result = await endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt); result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt); result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
} }
if (!result) { if (!result) {

View File

@@ -398,6 +398,7 @@
{/if} {/if}
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN} {#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
<!-- TODO -->
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen} {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
<a <a
class="button text-sm" class="button text-sm"
@@ -408,11 +409,6 @@
class="button text-sm" class="button text-sm"
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}" href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}"
>Formular</a> >Formular</a>
{:else if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
<a
class="button text-sm"
href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?id={ausweis.id}"
>Formular</a>
{/if} {/if}
{/if} {/if}

View File

@@ -1,89 +1,113 @@
<script lang="ts"> <script lang="ts">
import { import { ripple } from "svelte-ripple-action";
Reader, import type { RippleOptions } from "svelte-ripple-action/dist/constants.js";
Bell, import { Reader, Bell, Gear, LockClosed, CaretDown } from "radix-svelte-icons"
Gear,
LockClosed,
CaretDown,
} from "radix-svelte-icons";
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte"; import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
import DashboardNotification from "./DashboardNotification.svelte"; import DashboardNotification from "./DashboardNotification.svelte";
import { notifications } from "#components/NotificationProvider/shared.js"; import { notifications } from "#components/NotificationProvider/shared.js";
import ThemeController from "#components/ThemeController.svelte"; import ThemeController from "#components/ThemeController.svelte";
import { import { BenutzerClient, ObjektKomplettClient } from "#components/Ausweis/types.js";
BenutzerClient,
ObjektKomplettClient,
} from "#components/Ausweis/types.js";
export let lightTheme: boolean; export let lightTheme: boolean;
export let benutzer: BenutzerClient; export let benutzer: BenutzerClient;
const rippleOptions: RippleOptions = {
center: false,
color: lightTheme ? "rgba(233,233,233,0.1)" : "rgba(113, 128, 150, 0.1)",
};
let headerOpen = false;
</script> </script>
<aside class="rounded-lg bg-white box px-6 py-5"> <aside class:hidden={!headerOpen} class="fixed left-0 top-16 w-full h-[calc(100%-4rem)] flex md:relative md:h-auto md:w-auto md:top-0 md:flex bg-base-200 border-r border-r-base-300 flex-col py-4">
<div class="flex flex-row items-center">
<div class="flex flex-row items-center px-4">
<div class="flex flex-row mr-6"> <div class="flex flex-row mr-6">
<a href="/" <a href="/"><img src="/images/header/logo-IBC-big.svg" class="h-16" alt="IBCornelsen - Logo"/></a>
><img
src="/images/header/logo-IBC-big.svg"
class="h-16"
alt="IBCornelsen - Logo"
/></a
>
</div> </div>
<div class="flex-col items-end"> <div class="flex-col items-end">
<div class="text-base-content font-semibold text-left flex"> <div class="text-base-content font-semibold text-left flex"
{benutzer.vorname} >{benutzer.vorname} {benutzer.name}</div>
{benutzer.name}
</div>
<div class="text-base-content text-sm flex">{benutzer.email}</div> <div class="text-base-content text-sm flex">{benutzer.email}</div>
<a href="/auth/logout" class="text-xs">Logout</a> <a href="/auth/logout" class="text-xs">Logout</a>
</div> </div>
</div> </div>
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0"> <div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
<a class="button-tab" href="/dashboard"> <a use:ripple={rippleOptions} class="button-tab" href="/dashboard">
<Reader width={22} height={22} /> <Reader width={22} height={22} />
Vorgänge Vorgänge
</a> </a>
<a class="button-tab" href="/dashboard"> <a use:ripple={rippleOptions} class="button-tab" href="/dashboard">
<Reader width={22} height={22} /> <Reader width={22} height={22} />
Inbox Inbox
</a> </a>
<hr class="border-gray-600" /> <hr class="border-gray-600">
<!--
<div class="text-base-content text-xl px-4 mt-4">Mitwirkende</div>
<div class="flex flex-col gap-4 px-4">
{#each [
{ name: "Max Mustermann", image: "/images/profile-placeholder.svg", profession: "Architekt" },
{ name: "Erika Musterfrau", image: "/images/profile-placeholder.svg", profession: "Ingenieurin" },
{ name: "Hans Beispiel", image: "/images/profile-placeholder.svg", profession: "Energieberater" },
{ name: "Anna Beispiel", image: "/images/profile-placeholder.svg", profession: "Bauleiterin" }
] as person}
<div class="flex items-center gap-4">
<img src={person.image} alt={person.name} class="w-12 h-12 rounded-full object-cover" />
<div class="flex flex-col">
<span class="text-base-content font-medium">{person.name}</span>
<span class="text-sm text-gray-500">{person.profession}</span>
</div>
<button class="ml-auto btn btn-primary btn-sm">Chat</button>
</div>
{/each}
</div>
-->
<!-- <button use:ripple={rippleOptions} class="button-tab">
<EnvelopeClosed width={22} height={22} />
Kontakt
</button>
<li><details class="[&_.caret]:open:rotate-180">
<summary class="button-tab w-full outline-0 hover:outline-0">
<Cube width={22} height={22} />
Services <CaretDown size={24} class="caret ml-auto transition-transform"></CaretDown></summary>
<ul>
<li>
<button use:ripple={rippleOptions} class="button-tab">
Kontakt
</button>
</li>
<li>
<button use:ripple={rippleOptions} class="button-tab">
Kontakt
</button>
</li>
</ul>
</details></li> -->
{#if benutzer.rolle === "ADMIN"} {#if benutzer.rolle === "ADMIN"}
<li> <li><details class="[&_.caret]:open:rotate-180" open>
<details class="[&_.caret]:open:rotate-180" open> <summary class="button-tab w-full outline-0 hover:outline-0 cursor-pointer">
<summary <LockClosed width={22} height={22} />
class="button-tab w-full outline-0 hover:outline-0 cursor-pointer" Admin <CaretDown size={24} class="caret ml-auto transition-transform"></CaretDown></summary>
> <ul>
<LockClosed width={22} height={22} /> <li>
Admin <CaretDown <a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/ausweise-pruefen">
size={24} Ausweise Prüfen
class="caret ml-auto transition-transform" </a>
></CaretDown></summary </li>
> <li>
<ul> <a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/impersonate-user">
<li> Impersonate User
<a </a>
class="button-tab" </li>
href="/dashboard/admin/ausweise-pruefen" </ul>
> </details></li>
Ausweise Prüfen
</a>
</li>
<li>
<a
class="button-tab"
href="/dashboard/admin/impersonate-user"
>
Impersonate User
</a>
</li>
</ul>
</details>
</li>
{/if} {/if}
</div> </div>
<div class="mt-10 flex flex-col gap-4 px-8"> <div class="mt-10 flex flex-col gap-4 px-8">
@@ -92,26 +116,18 @@
<div class="dropdown dropdown-top"> <div class="dropdown dropdown-top">
<div class="indicator"> <div class="indicator">
{#if Object.keys($notifications).length > 0} {#if Object.keys($notifications).length > 0}
<span class="indicator-item badge badge-accent text-xs" <span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
>{Object.keys($notifications).length}</span
>
{/if} {/if}
<button <button tabindex="0" class="hover:bg-gray-200 p-3 rounded-lg">
tabindex="0"
class="hover:bg-gray-200 p-3 rounded-lg"
>
<Bell size={24} /> <Bell size={24} />
</button> </button>
</div> </div>
<ul <ul class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80">
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
>
<NotificationProvider component={DashboardNotification} /> <NotificationProvider component={DashboardNotification} />
</ul> </ul>
</div> </div>
<a <a href="/dashboard/einstellungen"
href="/dashboard/einstellungen"
class="hover:bg-gray-200 p-3 rounded-lg" class="hover:bg-gray-200 p-3 rounded-lg"
> >
<Gear size={24} /> <Gear size={24} />
@@ -121,8 +137,10 @@
<div class="divider px-8"></div> <div class="divider px-8"></div>
<a <a
href="/dashboard/einstellungen" href="/dashboard/einstellungen"
use:ripple={rippleOptions}
class="hover:bg-gray-200 no-animation focus:shadow-none justify-start py-4 h-auto px-8 rounded-none w-full flex flex-row gap-4" class="hover:bg-gray-200 no-animation focus:shadow-none justify-start py-4 h-auto px-8 rounded-none w-full flex flex-row gap-4"
> >
</a> </a>
</aside> </aside>

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const BedarfsausweisGewerbeSchema = z.object({ export const BedarfsausweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -20,7 +20,6 @@ export const BedarfsausweisGewerbeSchema = z.object({
bauteilaktivierung: z.boolean().nullish(), bauteilaktivierung: z.boolean().nullish(),
klimatisierung: z.boolean().nullish(), klimatisierung: z.boolean().nullish(),
nachweistyp: z.nativeEnum(AusweisTyp), nachweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const BedarfsausweisWohnenSchema = z.object({ export const BedarfsausweisWohnenSchema = z.object({
id: z.string(), id: z.string(),
@@ -86,7 +86,6 @@ export const BedarfsausweisWohnenSchema = z.object({
pruefpunkt_geometrie: z.boolean().nullish(), pruefpunkt_geometrie: z.boolean().nullish(),
pruefpunkt_fenster: z.boolean().nullish(), pruefpunkt_fenster: z.boolean().nullish(),
ausweistyp: z.nativeEnum(AusweisTyp), ausweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
rechnung_id: z.string().nullish(), rechnung_id: z.string().nullish(),
aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"), aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"),
}) })

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const GEGNachweisGewerbeSchema = z.object({ export const GEGNachweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -10,7 +10,6 @@ export const GEGNachweisGewerbeSchema = z.object({
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(), zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(), beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
nachweistyp: z.nativeEnum(AusweisTyp), nachweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const GEGNachweisWohnenSchema = z.object({ export const GEGNachweisWohnenSchema = z.object({
id: z.string(), id: z.string(),
@@ -10,7 +10,6 @@ export const GEGNachweisWohnenSchema = z.object({
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(), zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(), beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
nachweistyp: z.nativeEnum(AusweisTyp), nachweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const VerbrauchsausweisGewerbeSchema = z.object({ export const VerbrauchsausweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -52,7 +52,6 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
ausweistyp: z.nativeEnum(AusweisTyp), ausweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
pruefpunkt_heizungsalter: z.boolean().nullish(), pruefpunkt_heizungsalter: z.boolean().nullish(),
pruefpunkt_verbrauch_niedrig: z.boolean().nullish(), pruefpunkt_verbrauch_niedrig: z.boolean().nullish(),
pruefpunkt_verbrauch_hoch: z.boolean().nullish(), pruefpunkt_verbrauch_hoch: z.boolean().nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const VerbrauchsausweisWohnenSchema = z.object({ export const VerbrauchsausweisWohnenSchema = z.object({
id: z.string().describe("ID des Ausweises"), id: z.string().describe("ID des Ausweises"),
@@ -38,7 +38,6 @@ export const VerbrauchsausweisWohnenSchema = z.object({
beschreibung: z.string().nullish(), beschreibung: z.string().nullish(),
kontrolldatei_angefragt: z.boolean().describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde").nullish(), kontrolldatei_angefragt: z.boolean().describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde").nullish(),
ausweistyp: z.nativeEnum(AusweisTyp), ausweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
pruefpunkt_heizungsalter: z.boolean().nullish(), pruefpunkt_heizungsalter: z.boolean().nullish(),

View File

@@ -3,19 +3,22 @@
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 { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import { BenutzerClient, ObjektClient } from "#components/Ausweis/types";
const valid = validateAccessTokenServer(Astro)
if (!valid) {
Astro.redirect("/auth/login", 302)
}
export interface Props { export interface Props {
title: string; title: string;
user: BenutzerClient; user: BenutzerClient
} }
const { title, user } = Astro.props; const { title, user } = Astro.props;
if (!user) {
Astro.redirect("/auth/login", 302);
}
const schema = JSON.stringify({ const schema = JSON.stringify({
"@context": "http://schema.org", "@context": "http://schema.org",
"@type": "Corporation", "@type": "Corporation",
@@ -50,22 +53,22 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
if (import.meta.env.PROD) { if (import.meta.env.PROD) {
H.init("1jdkoe52", { H.init("1jdkoe52", {
serviceName: "online-energieausweis", serviceName: "online-energieausweis",
backendUrl: backendUrl: "https://highlight-backend.online-energieausweis.org/public",
"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>
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<script type="application/ld+json" set:html={schema} /> <script type="application/ld+json" set:html={schema}></script>
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" /> <link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
<meta <meta
@@ -109,6 +112,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
</head> </head>
<body> <body>
<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
@@ -118,15 +122,16 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
xl:grid-cols-[minmax(150px,350px)1fr] xl:gap-4 xl:p-6 xl:grid-cols-[minmax(150px,350px)1fr] xl:gap-4 xl:p-6
2xl:grid-cols-[minmax(150px,300px)1fr] 2xl:gap-5 2xl:p-6" 2xl:grid-cols-[minmax(150px,300px)1fr] 2xl:gap-5 2xl:p-6"
> >
<DashboardSidebar
lightTheme={lightTheme}
benutzer={user}
client:load
/>
<article class="box px-6 py-5 h-screen"> <DashboardSidebar lightTheme={lightTheme} benutzer={user} client:load>
<slot /> </DashboardSidebar>
</article>
<article class="box rounded-tl-none
xl:px-10 py-8">
<slot />
</article>
</main> </main>
</body> </body>
</html> </html>

View File

@@ -30,7 +30,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
const form = pdf.getForm() const form = pdf.getForm()
form.updateFieldAppearances(font) form.updateFieldAppearances(font)
pages[0].drawText(`ID: ${ausweis.id || ""}`, { pages[0].drawText(`ID: ${aufnahme.id || ""}`, {
x: 211, x: 211,
y: height - 112.5, y: height - 112.5,
size: 10 size: 10
@@ -213,20 +213,15 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => { 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 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 // 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 endenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 1000
const stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000 const stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000
const vergleichsWertWaermeTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / 1000
const vergleichsWertStromTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / 1000
const minTranslation = 78 const minTranslation = 78
const maxTranslation = 512 const maxTranslation = 512
const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage; const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage;
const stromVerbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * stromVerbrauchTranslationPercentage; const stromVerbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * stromVerbrauchTranslationPercentage;
const vergleichsWertWaermeTranslationX = minTranslation + (maxTranslation - minTranslation) * vergleichsWertWaermeTranslationPercentage;
const vergleichsWertStromTranslationX = minTranslation + (maxTranslation - minTranslation) * vergleichsWertStromTranslationPercentage;
const pfeilWidth = 20 const pfeilWidth = 20
const margin = 5; const margin = 5;
@@ -238,17 +233,8 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
height: 30 height: 30
}) })
page.drawImage(pfeilNachOben, {
x: vergleichsWertWaermeTranslationX,
y: height - 293,
width: pfeilWidth,
height: 30
})
const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`; const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
const stromVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchStrom.toString()}kWh/(m²a)`; const stromVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchStrom.toString()}kWh/(m²a)`;
const vergleichswertWaermeText = `${berechnungen?.vergleichsWertWaerme.toString()}kWh/(m²a)`
const vergleichswertStromText = `${berechnungen?.vergleichsWertStrom.toString()}kWh/(m²a)`
if (endenergieverbrauchTranslationPercentage > 0.5) { if (endenergieverbrauchTranslationPercentage > 0.5) {
page.drawText("Endenergieverbrauch Wärme", { page.drawText("Endenergieverbrauch Wärme", {
@@ -277,33 +263,6 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
}) })
} }
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Wärme", {
x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10),
y: height - 275,
size: 10
})
page.drawText(vergleichswertWaermeText, {
x: vergleichsWertWaermeTranslationX - margin - bold.widthOfTextAtSize(vergleichswertWaermeText, 10),
y: height - 289,
size: 10,
font: bold
})
} else {
page.drawText("Vergleichswert Wärme", {
x: vergleichsWertWaermeTranslationX + pfeilWidth + margin,
y: height - 275,
size: 10
})
page.drawText(vergleichswertWaermeText, {
x: vergleichsWertWaermeTranslationX + pfeilWidth + margin,
y: height - 289,
size: 10,
font: bold
})
}
page.drawImage(pfeilNachUnten, { page.drawImage(pfeilNachUnten, {
x: stromVerbrauchTranslationX, x: stromVerbrauchTranslationX,
y: height - 354, y: height - 354,
@@ -311,13 +270,6 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
height: 30 height: 30
}) })
page.drawImage(pfeilNachOben, {
x: vergleichsWertStromTranslationX,
y: height - 437,
width: pfeilWidth,
height: 30
})
if (endenergieverbrauchTranslationPercentage > 0.5) { if (endenergieverbrauchTranslationPercentage > 0.5) {
page.drawText("Endenergieverbrauch Strom", { page.drawText("Endenergieverbrauch Strom", {
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10), x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10),
@@ -344,43 +296,16 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
font: bold font: bold
}) })
} }
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Strom", {
x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10),
y: height - 420,
size: 10
})
page.drawText(vergleichswertStromText, {
x: vergleichsWertStromTranslationX - margin - bold.widthOfTextAtSize(vergleichswertStromText, 10),
y: height - 434,
size: 10,
font: bold
})
} else {
page.drawText("Vergleichswert Strom", {
x: vergleichsWertStromTranslationX + pfeilWidth + margin,
y: height - 420,
size: 10
})
page.drawText(vergleichswertStromText, {
x: vergleichsWertStromTranslationX + pfeilWidth + margin,
y: height - 434,
size: 10,
font: bold
})
}
} }
addEnergieverbrauchSkalaPfeile(pages[2]) addEnergieverbrauchSkalaPfeile(pages[2])
if (ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
addCheckMark(pages[2], 41, height - 293) addCheckMark(pages[2], 41, height - 269)
} }
if (ausweis.kuehlung_enthalten) { if (ausweis.kuehlung_enthalten) {
addCheckMark(pages[2], 41, height - 305) addCheckMark(pages[2], 41, height - 281)
} }
if (ausweis.stromverbrauch_enthaelt_heizung) { if (ausweis.stromverbrauch_enthaelt_heizung) {

View File

@@ -28,7 +28,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
const font = await pdf.embedFont(StandardFonts.Helvetica) const font = await pdf.embedFont(StandardFonts.Helvetica)
const bold = await pdf.embedFont(StandardFonts.HelveticaBold) const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
pages[0].drawText(`ID: ${ausweis.id || ""}`, { pages[0].drawText(`ID: ${aufnahme.id || ""}`, {
x: 211, x: 211,
y: height - 112.5, y: height - 112.5,
size: 10 size: 10

View File

@@ -28,8 +28,6 @@ export async function getVerbrauchsausweisWohnenKomplett(id: string) {
}) })
} }
export type VerbrauchsausweisWohnenKomplett = Awaited<ReturnType<typeof getVerbrauchsausweisWohnenKomplett>>;
export async function getVerbrauchsausweisGewerbe(id: string): Promise<VerbrauchsausweisGewerbe | null> { export async function getVerbrauchsausweisGewerbe(id: string): Promise<VerbrauchsausweisGewerbe | null> {
return await prisma.verbrauchsausweisGewerbe.findUnique({ return await prisma.verbrauchsausweisGewerbe.findUnique({
where: { where: {

View File

@@ -1,52 +1,37 @@
import { getAusweisartFromId } from "#components/Ausweis/types.js"; import { getAusweisartFromId } from "#components/Ausweis/types.js";
import moment from "moment"; import moment from "moment";
import { createLexOfficeCustomer } from "./lexoffice.js"; import { createLexOfficeCustomer } from "./lexoffice.js";
import { Enums, prisma, Rechnung } from "./prisma.js"; import { Enums, prisma, Rechnung, VerbrauchsausweisWohnen } from "./prisma.js";
import { LEX_OFFICE_API_KEY, PRICES } from "#lib/constants.js"; import { LEX_OFFICE_API_KEY, PRICES } from "#lib/constants.js";
import { VerbrauchsausweisWohnenKomplett } from "./db.js";
export function createLineItem(name: string, preis: number, steuer: number) { export function createLineItem(name: string, preis: number, steuer: number) {
return { return {
type: "custom", "type": "custom",
name: name, "name": name,
description: "", "description": "",
quantity: 1, "quantity": 1,
lineItemAmount: preis, "lineItemAmount": preis,
unitName: name, "unitName": name,
unitPrice: { "unitPrice": {
currency: "EUR", "currency": "EUR",
grossAmount: preis, "grossAmount": preis,
taxRatePercentage: steuer, "taxRatePercentage": steuer
}, }
}; };
} }
type LineItem = ReturnType<typeof createLineItem>; export function addedServicesNeu(data: any, rechnung: Rechnung, steuer: number){
if (rechnung.services.includes(Enums.Service.Qualitaetsdruck)){
export function addedServicesNeu( data["lineItems"].push(createLineItem('Zusatzservice Postversand', 9, steuer))
data: any,
rechnung: Rechnung,
steuer: number
) {
if (rechnung.services.includes(Enums.Service.Qualitaetsdruck)) {
data["lineItems"].push(
createLineItem("Zusatzservice Postversand", 9, steuer)
);
} }
if (rechnung.services.includes(Enums.Service.Aushang)) { if (rechnung.services.includes(Enums.Service.Aushang)){
data["lineItems"].push( data["lineItems"].push(createLineItem('Zusatzservice Aushang', 10, steuer))
createLineItem("Zusatzservice Aushang", 10, steuer)
);
} }
if (rechnung.services.includes(Enums.Service.SameDay)) { if (rechnung.services.includes(Enums.Service.SameDay)){
data["lineItems"].push( data["lineItems"].push(createLineItem('Zusatzservice Same Day Service', 29, steuer))
createLineItem("Zusatzservice Same Day Service", 29, steuer)
);
} }
if (rechnung.services.includes(Enums.Service.Telefonberatung)) { if (rechnung.services.includes(Enums.Service.Telefonberatung)){
data["lineItems"].push( data["lineItems"].push(createLineItem('Zusatzservice Telefonische Beratung', 75, steuer))
createLineItem("Zusatzservice Telefonische Beratung", 75, steuer)
);
} }
return data; return data;
@@ -60,23 +45,16 @@ export function addedServicesNeu(
* @return array * @return array
* @throws Error * @throws Error
*/ */
export async function createInvoice( export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung: Rechnung) {
ausweis: VerbrauchsausweisWohnenKomplett,
rechnung: Rechnung
) {
if (!ausweis) {
throw new Error("Ausweis ist null");
}
if (!ausweis.benutzer_id) { if (!ausweis.benutzer_id) {
throw new Error("Benutzer ist nicht vorhanden"); throw new Error("Benutzer ist nicht vorhanden")
} }
const user = await prisma.benutzer.findUnique({ const user = await prisma.benutzer.findUnique({
where: { where: {
id: ausweis.benutzer_id, id: ausweis.benutzer_id
}, }
}); })
if (!user) { if (!user) {
throw new Error("Nutzer existiert nicht!"); throw new Error("Nutzer existiert nicht!");
@@ -88,195 +66,126 @@ export async function createInvoice(
await prisma.benutzer.update({ await prisma.benutzer.update({
where: { where: {
id: user.id, id: user.id
}, },
data: { data: {
lex_office_id: user.lex_office_id, lex_office_id: user.lex_office_id
}, }
}); })
} }
const ausweisart = getAusweisartFromId(ausweis.id); const ausweisart = getAusweisartFromId(ausweis.id);
let data = { let data = {
voucherDate: moment().format("YYYY-MM-DDTHH:mm:ss.SSSZ"), "voucherDate": moment().format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
taxConditions: { "taxConditions": {
taxType: "gross", "taxType": "gross"
}, },
shippingConditions: { "shippingConditions": {
shippingType: "none", "shippingType": "none"
}, },
address: { "address": {
contactId: user.lex_office_id, "contactId": user.lex_office_id,
name: rechnung.empfaenger || "----", "name": rechnung.empfaenger || "----",
street: rechnung.strasse, "street": rechnung.strasse,
city: rechnung.ort, "city": rechnung.ort,
zip: rechnung.plz, "zip": rechnung.plz,
countryCode: "DE", "countryCode": "DE",
supplement: rechnung.zusatzzeile, "supplement": rechnung.zusatzzeile
}, },
lineItems: [] as LineItem[], "lineItems": [],
totalPrice: { "totalPrice": {
currency: "EUR", "currency": "EUR",
totalGrossAmount: rechnung.betrag, "totalGrossAmount": rechnung.betrag,
}, },
title: "Rechnung", "title": "Rechnung",
introduction: "introduction": "Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung",
"Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung", "remark": "Vielen Dank für Ihren Einkauf."
remark: "Vielen Dank für Ihren Einkauf.",
}; };
if (rechnung.status == Enums.Rechnungsstatus.paid) { if (rechnung.status == Enums.Rechnungsstatus.paid) {
const types: Record<Enums.Bezahlmethoden, string> = { const types = {
[Enums.Bezahlmethoden.paypal]: "PayPal", [Enums.Bezahlmethoden.paypal]: "PayPal",
[Enums.Bezahlmethoden.creditcard]: "Kreditkarte", [Enums.Bezahlmethoden.creditcard]: "Kreditkarte",
[Enums.Bezahlmethoden.sofort]: "Sofortüberweisung", [Enums.Bezahlmethoden.sofort]: "Sofortüberweisung",
[Enums.Bezahlmethoden.giropay]: "Giropay", [Enums.Bezahlmethoden.giropay]: "Giropay",
[Enums.Bezahlmethoden.rechnung]: "Rechnung",
}; };
const type = types[rechnung.bezahlmethode]; const type = types[rechnung.bezahlmethode];
data[ data["introduction"] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`;
"introduction"
] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`;
} }
const tax_rate = 19; const tax_rate = 19;
if (rechnung.betrag == 15) { if (rechnung.betrag == 15) {
// Korrektur alleinstehend // Korrektur alleinstehend
data["lineItems"].push( data["lineItems"].push(createLineItem("Service Korrektur anfordern", rechnung.betrag, 19));
createLineItem("Service Korrektur anfordern", rechnung.betrag, 19)
);
} else if (rechnung.betrag == 476) { } else if (rechnung.betrag == 476) {
data["lineItems"].push( data["lineItems"].push(createLineItem("GEG Berechnung Wohngebäude", rechnung.betrag, 19));
createLineItem("GEG Berechnung Wohngebäude", rechnung.betrag, 19)
);
} else if (rechnung.betrag > 400 && rechnung.betrag != 476) { } else if (rechnung.betrag > 400 && rechnung.betrag != 476) {
data["lineItems"].push( data["lineItems"].push(createLineItem("Bedarfsausweis Gewerbe", rechnung.betrag, 19));
createLineItem("Bedarfsausweis Gewerbe", rechnung.betrag, 19)
);
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19));
createLineItem(
`Verbrauchsausweis Online (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Standard,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19));
createLineItem(
`Verbrauchsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Beratung,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Verbrauchsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19));
createLineItem(
`Verbrauchsausweis Offline (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Offline,
19
)
);
} }
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) { } else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Bedarfsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19));
createLineItem(
`Bedarfsausweis Online (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Standard,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19));
createLineItem(
`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Beratung,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Bedarfsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19));
createLineItem(
`Bedarfsausweis Offline (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Offline,
19
)
);
} }
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Standard, 19));
createLineItem(
`Verbrauchsausweis Nichtwohngebäude Online (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisGewerbe.Standard,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Beratung, 19));
createLineItem(
`Verbrauchsausweis Nichtwohngebäude Online (Vorprüfung negativ) (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisGewerbe.Beratung,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
data["lineItems"].push( data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Offline, 19));
createLineItem(
`Verbrauchsausweis Nichtwohngebäude Offline (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisGewerbe.Offline,
19
)
);
} }
} }
data = addedServicesNeu(data, rechnung, 19); data = addedServicesNeu(data, rechnung, 19);
const response = await fetch(
"https://api.lexoffice.io/v1/invoices?finalize=true", const response = await fetch("https://api.lexoffice.io/v1/invoices?finalize=true", {
{ method: "POST",
method: "POST", headers: {
headers: { Accept: `application/json`,
Accept: `application/json`, Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`, "Content-Type": "application/json"
"Content-Type": "application/json", },
}, body: JSON.stringify(data)
body: JSON.stringify(data), })
}
);
if (response.status == 400) { if (response.status == 400) {
throw new Error("Fehler beim Absenden der Request."); throw new Error("Fehler beim Absenden der Request.")
} }
const invoice = await response.json(); const invoice = await response.json()
// Wir müssen den Ausweis nun wieder abfragen, um die erstellte Rechnungsnummer zu bekommen. // Wir müssen den Ausweis nun wieder abfragen, um die erstellte Rechnungsnummer zu bekommen.
const response_id = invoice["id"]; const response_id = invoice["id"];
const request = await fetch( const request = await fetch(`https://api.lexoffice.io/v1/invoices/${response_id}`, {
`https://api.lexoffice.io/v1/invoices/${response_id}`, method: "GET",
{ headers: {
method: "GET", Accept: `application/json`,
headers: { Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
Accept: `application/json`, "Content-Type": "application/json"
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
"Content-Type": "application/json",
},
} }
); })
const abfrage_response = await request.json(); const abfrage_response = await request.json()
return { return {
id: invoice["id"], id: invoice["id"],
voucherNumber: abfrage_response["voucherNumber"], voucherNumber: abfrage_response["voucherNumber"]
}; }
} }

View File

@@ -2,6 +2,7 @@
import "../../style/formular.css"; import "../../style/formular.css";
import { import {
BenutzerClient, BenutzerClient,
ObjektClient,
ObjektKomplettClient, ObjektKomplettClient,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import DashboardObjekt from "#components/Dashboard/DashboardObjekt.svelte"; import DashboardObjekt from "#components/Dashboard/DashboardObjekt.svelte";
@@ -13,7 +14,10 @@
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import Pagination from "#components/Pagination.svelte"; import Pagination from "#components/Pagination.svelte";
import { Enums, Objekt } from "#lib/client/prisma.js"; import AusweisePruefenFilter from "#components/Dashboard/AusweisePruefenFilter.svelte";
import { filterAusweise } from "#lib/filters.js";
import { z, ZodTypeAny } from "zod";
import { Enums } from "#lib/client/prisma.js";
export let user: BenutzerClient; export let user: BenutzerClient;
export let objekte: ObjektKomplettClient[]; export let objekte: ObjektKomplettClient[];
@@ -22,7 +26,7 @@
let objektOverlayHidden = true; let objektOverlayHidden = true;
let objekt: Objekt = { let objekt: Omit<ObjektClient, "uid"> = {
adresse: "", adresse: "",
erstellungsdatum: new Date(), erstellungsdatum: new Date(),
latitude: 0, latitude: 0,
@@ -87,6 +91,8 @@
objekte = objekte objekte = objekte
} }
let filters: { name: keyof z.infer<typeof filterAusweise>, type: ZodTypeAny, value: any }[] = []
export let id: string = ""; export let id: string = "";
</script> </script>

View File

@@ -27,7 +27,7 @@
<span>{user.vorname} {user.name}</span> <span>{user.vorname} {user.name}</span>
<span class="text-xs">{user.email}</span> <span class="text-xs">{user.email}</span>
</div> </div>
<a href="/dashboard/admin/impersonate?id={user.id}" class="button text-sm">Einloggen</a> <a href="/dashboard/admin/impersonate?uid={user.uid}" class="button text-sm">Einloggen</a>
</div> </div>
{/each} {/each}
</div> </div>

View File

@@ -32,8 +32,6 @@
import { getMaximumDevitationInPercent } from "#client/lib/helpers.js"; import { getMaximumDevitationInPercent } from "#client/lib/helpers.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
export let user: Partial<BenutzerClient>; export let user: Partial<BenutzerClient>;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
@@ -396,6 +394,33 @@
} }
} }
/**
* TODO
* Ausschlusskriterien: Neubau, Modernisierung
Baujahr vor 1978, unsaniert und bis 4 Wohneinheiten /
Heizung jünger als 3 Jahre / Verbrauchsjahre unvollständig / Verbrauchsjahre nicht aktuell genug /
Klimafaktoren unvollständig /
Leerstand größer 30% /
Fehlende oder unvollständige Bilder (pro Abschnitt mindestens ein Bild) /
Fehlende Angaben zum Sanierungsstand (Bei F mindestens 2 Haken), (Bei G mindestens 1 Haken)
*/
let bestellenNichtMoeglich = false;
if (
((ausweis.ausstellgrund === "Neubau" ||
ausweis.ausstellgrund === "Modernisierung") &&
aufnahme.baujahr_gebaeude[0] < 1978 &&
aufnahme.saniert === false &&
aufnahme.einheiten &&
aufnahme.einheiten > 4) ||
new Date().getFullYear() - aufnahme.baujahr_heizung[0] < 3 ||
!ausweis.verbrauch_1 ||
!ausweis.verbrauch_2 ||
!ausweis.verbrauch_3 ||
(aufnahme.leerstand && aufnahme.leerstand > 30)
) {
bestellenNichtMoeglich = true;
}
const gegAnfrage = const gegAnfrage =
ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisWohnen ||
ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe ||
@@ -899,7 +924,7 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
<h3>Bitte untenstehende Punkte bestätigen. Bitte gehen Sie gegebenenfalls zurück zum Formular und überprüfen bzw. korrigieren Ihre Eingaben.</h3> <h3>Bitte untenstehende Punkte bestätigen. Bitte gehen Sie gegebenenfalls zurück zum Formular und überprüfen bzw. korrigieren Ihre Eingaben.</h3>
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe} {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
{@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt)} {@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt)}
{#await request} {#await request}

View File

@@ -20,11 +20,7 @@ import { PutObjectCommand } from "@aws-sdk/client-s3";
import { s3Client } from "#lib/s3.js"; import { s3Client } from "#lib/s3.js";
import { createInvoice } from "#lib/server/invoice.js"; import { createInvoice } from "#lib/server/invoice.js";
import { tryCatch } from "#lib/tryCatch.js"; import { tryCatch } from "#lib/tryCatch.js";
import { import { getBedarfsausweisWohnenKomplett, getVerbrauchsausweisGewerbeKomplett, getVerbrauchsausweisWohnenKomplett } from "#lib/server/db.js";
getBedarfsausweisWohnenKomplett,
getVerbrauchsausweisGewerbeKomplett,
getVerbrauchsausweisWohnenKomplett,
} from "#lib/server/db.js";
export const GET = defineApiRoute({ export const GET = defineApiRoute({
input: z.object({ input: z.object({
@@ -44,18 +40,18 @@ export const GET = defineApiRoute({
aufnahme: Aufnahme & { aufnahme: Aufnahme & {
bilder: Bild[]; bilder: Bild[];
objekt: Objekt & { objekt: Objekt & {
benutzer: Benutzer | null; benutzer: Benutzer;
}; };
}; };
}) })
| null = null; | null = null;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis); ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis)
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis); ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis)
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis); ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis)
} }
if (!ausweis) { if (!ausweis) {
@@ -85,24 +81,22 @@ export const GET = defineApiRoute({
} }
if (!rechnung.lex_office_id) { if (!rechnung.lex_office_id) {
const [result, error] = await tryCatch( const [result, error] = await tryCatch(createInvoice(ausweis, rechnung));
createInvoice(ausweis, rechnung)
);
if (error) { if (error) {
return; return
} }
const { id, voucherNumber } = result; const { id, voucherNumber } = result;
await prisma.rechnung.update({ await prisma.rechnung.update({
where: { where: {
id: rechnung.id, id: rechnung.id
}, },
data: { data: {
lex_office_id: id, lex_office_id: id
}, }
}); })
} }
const pdfAusweis = await getAnsichtsausweis( const pdfAusweis = await getAnsichtsausweis(
@@ -129,7 +123,7 @@ export const GET = defineApiRoute({
ACL: "private", ACL: "private",
}); });
await s3Client.send(command); const response = await s3Client.send(command);
} }
if (pdfDatenblatt) { if (pdfDatenblatt) {
@@ -140,7 +134,7 @@ export const GET = defineApiRoute({
ACL: "private", ACL: "private",
}); });
await s3Client.send(command); const response = await s3Client.send(command);
} }
let text: string; let text: string;
@@ -236,30 +230,30 @@ fax 040 · 209339859
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
await prisma.verbrauchsausweisWohnen.update({ await prisma.verbrauchsausweisWohnen.update({
where: { where: {
id: ausweis.id, id: ausweis.id
}, },
data: { data: {
ausgestellt: true, ausgestellt: true
}, }
}); })
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
await prisma.verbrauchsausweisGewerbe.update({ await prisma.verbrauchsausweisGewerbe.update({
where: { where: {
id: ausweis.id, id: ausweis.id
}, },
data: { data: {
ausgestellt: true, ausgestellt: true
}, }
}); })
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
await prisma.bedarfsausweisWohnen.update({ await prisma.bedarfsausweisWohnen.update({
where: { where: {
id: ausweis.id, id: ausweis.id
}, },
data: { data: {
ausgestellt: true, ausgestellt: true,
}, }
}); })
} }
}, },
}); });

View File

@@ -1,4 +1,4 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js"; import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
@@ -19,8 +19,7 @@ export const PATCH = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true, zurueckgestellt: true
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -25,8 +25,7 @@ export const PUT = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true, zurueckgestellt: true
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -1,9 +1,9 @@
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js"; import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js"; import { BedarfsausweisWohnen, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js"; import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
import { z } from "zod"; import { z } from "zod";
@@ -19,8 +19,7 @@ export const PATCH = defineApiRoute({
zurueckgestellt: true, zurueckgestellt: true,
created_at: true, created_at: true,
updated_at: true, updated_at: true,
storniert: true, storniert: true
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -29,7 +29,6 @@ export const PUT = defineApiRoute({
created_at: true, created_at: true,
updated_at: true, updated_at: true,
storniert: true, storniert: true,
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix, aufnahme_id: UUidWithPrefix,
}), }),

View File

@@ -1,4 +1,4 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js"; import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
@@ -19,8 +19,7 @@ export const PATCH = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true, zurueckgestellt: true
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -25,8 +25,7 @@ export const PUT = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true, zurueckgestellt: true
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -19,8 +19,7 @@ export const PATCH = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true, zurueckgestellt: true
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -25,8 +25,7 @@ export const PUT = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true, zurueckgestellt: true
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -217,7 +217,7 @@ export const PUT = defineApiRoute({
method: input.bezahlmethode as PaymentMethod, method: input.bezahlmethode as PaymentMethod,
description: "Verbrauchsausweis Wohnen 2016", description: "Verbrauchsausweis Wohnen 2016",
redirectUrl: `https://online-energieausweis.org/payment/success?a=${ausweis.id}&r=${rechnung.id}`, redirectUrl: `https://online-energieausweis.org/payment/success?a=${ausweis.id}&r=${rechnung.id}`,
webhookUrl: `https://online-energieausweis.org/api/webhooks/mollie`, webhookUrl: `https://online-energieausweis.org/api/webhooks/mollie?uid=${rechnung.id}`,
cancelUrl: `https://online-energieausweis.org/kundendaten?a=${ausweis.id}&r=${rechnung.id}` cancelUrl: `https://online-energieausweis.org/kundendaten?a=${ausweis.id}&r=${rechnung.id}`
}); });

View File

@@ -14,8 +14,7 @@ export const PATCH = defineApiRoute({
benutzer_id: true, benutzer_id: true,
aufnahme_id: true, aufnahme_id: true,
updated_at: true, updated_at: true,
created_at: true, created_at: true
ausweisart: true
}).merge(z.object({ }).merge(z.object({
startdatum: z.coerce.date().nullable(), startdatum: z.coerce.date().nullable(),
})), })),

View File

@@ -21,8 +21,7 @@ export const PUT = defineApiRoute({
aufnahme_id: true, aufnahme_id: true,
rechnung_id: true, rechnung_id: true,
updated_at: true, updated_at: true,
created_at: true, created_at: true
ausweisart: true
}).merge(z.object({ }).merge(z.object({
startdatum: z.coerce.date().nullable() startdatum: z.coerce.date().nullable()
})), })),

View File

@@ -15,8 +15,7 @@ export const PATCH = defineApiRoute({
aufnahme_id: true, aufnahme_id: true,
rechnung_id: true, rechnung_id: true,
created_at: true, created_at: true,
updated_at: true, updated_at: true
ausweisart: true
}).merge(z.object({ }).merge(z.object({
startdatum: z.coerce.date().nullable() startdatum: z.coerce.date().nullable()
})), })),

View File

@@ -26,8 +26,7 @@ export const PUT = defineApiRoute({
aufnahme_id: true, aufnahme_id: true,
rechnung_id: true, rechnung_id: true,
created_at: true, created_at: true,
updated_at: true, updated_at: true
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -57,7 +57,6 @@ export const POST = defineApiRoute({
data: { data: {
status: payment.status as Enums.Rechnungsstatus, status: payment.status as Enums.Rechnungsstatus,
transaktions_referenz: payment.id, transaktions_referenz: payment.id,
bezahlt_am: new Date()
}, },
}); });
}, },

View File

@@ -10,6 +10,7 @@ import ImpersonateUserModule from "#modules/ImpersonateUserModule.svelte";
const caller = createCaller(Astro) const caller = createCaller(Astro)
const params = Astro.params; const params = Astro.params;
const page = Number(params.page)
const user = await caller.user.self.GET.fetch(undefined, { const user = await caller.user.self.GET.fetch(undefined, {
headers: { headers: {

View File

@@ -22,15 +22,15 @@ if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
return Astro.redirect("/dashboard") return Astro.redirect("/dashboard")
} }
const id = Astro.url.searchParams.get("id") const uid = Astro.url.searchParams.get("uid")
if (!id) { if (!uid) {
return Astro.redirect("/404") return Astro.redirect("/404")
} }
const searchedUser = await prisma.benutzer.findUnique({ const searchedUser = await prisma.benutzer.findUnique({
where: { where: {
id uid
} }
}) })
@@ -40,12 +40,12 @@ if (!searchedUser) {
const refreshTokenExpiry = moment().add(30, "days"); const refreshTokenExpiry = moment().add(30, "days");
const accessToken = encodeToken({ const accessToken = encodeToken({
id: searchedUser.id, uid: searchedUser.uid,
typ: TokenType.Access, typ: TokenType.Access,
exp: moment().add(30, "minutes").valueOf(), exp: moment().add(30, "minutes").valueOf(),
}); });
const refreshToken = encodeToken({ const refreshToken = encodeToken({
id: searchedUser.id, uid: searchedUser.uid,
typ: TokenType.Refresh, typ: TokenType.Refresh,
exp: refreshTokenExpiry.valueOf(), exp: refreshTokenExpiry.valueOf(),
}); });
@@ -60,6 +60,7 @@ Astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, accessToken, {
path: "/", path: "/",
expires: moment().add(30, "minutes").toDate() expires: moment().add(30, "minutes").toDate()
}) })
Astro.cookies.set("uid", searchedUser.uid)
return Astro.redirect("/dashboard") return Astro.redirect("/dashboard")
--- ---

View File

@@ -1,15 +1,23 @@
--- ---
import UserLayout from "#layouts/DashboardLayout.astro"; import UserLayout from "#layouts/DashboardLayout.astro";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { Enums, prisma } from "#lib/server/prisma"; import { Enums, prisma } from "#lib/server/prisma";
import { createCaller } from "src/astro-typesafe-api-caller";
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte"; import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
import { getCurrentUser } from "#lib/server/user";
const caller = createCaller(Astro)
const params = Astro.params; const params = Astro.params;
const page = Number(params.page) const page = Number(params.page)
const id = Astro.url.searchParams.get("id") || undefined; const id = Astro.url.searchParams.get("id") || undefined;
const user = await getCurrentUser(Astro)
const user = await caller.user.self.GET.fetch(undefined, {
headers: {
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
if (!user) { if (!user) {
return Astro.redirect("/auth/login") return Astro.redirect("/auth/login")