Revert "Revert "Bugfixes"" #508
@@ -96,7 +96,7 @@
|
||||
"postcss-import": "^16.1.0",
|
||||
"postcss-nesting": "^13.0.1",
|
||||
"prettier": "^2.8.8",
|
||||
"prisma": "^6.4.1",
|
||||
"prisma": "6.4.1",
|
||||
"prisma-dbml-generator": "^0.12.0",
|
||||
"prisma-generator-fake-data": "^0.14.3",
|
||||
"tsx": "^4.19.3",
|
||||
|
||||
17
prisma/migrations/20250409152238_ausweis_id/migration.sql
Normal file
17
prisma/migrations/20250409152238_ausweis_id/migration.sql
Normal file
@@ -0,0 +1,17 @@
|
||||
-- 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';
|
||||
@@ -26,6 +26,7 @@ model BedarfsausweisGewerbe {
|
||||
klimatisierung Boolean? @default(false)
|
||||
|
||||
nachweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(BedarfsausweisGewerbe)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
@@ -100,6 +100,7 @@ model BedarfsausweisWohnen {
|
||||
pruefpunkt_fenster Boolean? @default(false)
|
||||
|
||||
ausweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(BedarfsausweisWohnen)
|
||||
|
||||
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ model GEGNachweisGewerbe {
|
||||
beschreibung String? @db.Text
|
||||
|
||||
nachweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(GEGNachweisGewerbe)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
@@ -17,6 +17,7 @@ model GEGNachweisWohnen {
|
||||
beschreibung String? @db.Text
|
||||
|
||||
nachweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(GEGNachweisWohnen)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
@@ -74,6 +74,7 @@ model VerbrauchsausweisGewerbe {
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
ausweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(VerbrauchsausweisGewerbe)
|
||||
|
||||
pruefpunkt_heizungsalter Boolean? @default(false)
|
||||
pruefpunkt_verbrauch_niedrig Boolean? @default(false)
|
||||
|
||||
@@ -75,6 +75,7 @@ model VerbrauchsausweisWohnen {
|
||||
kontrolldatei_angefragt Boolean? @default(false)
|
||||
|
||||
ausweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(VerbrauchsausweisWohnen)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
Binary file not shown.
@@ -1,5 +1,4 @@
|
||||
import { api } from "astro-typesafe-api/client";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import Cookies from "js-cookie";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import {
|
||||
@@ -566,7 +565,7 @@ export async function ausweisSpeichern(
|
||||
return;
|
||||
}
|
||||
|
||||
aufnahme.id = aufnahme_id;
|
||||
aufnahme.id = aufnahme_id as string;
|
||||
|
||||
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
const id = await verbrauchsausweisWohnenSpeichern(
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<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 {
|
||||
BedarfsausweisWohnenClient,
|
||||
@@ -9,8 +8,9 @@
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
|
||||
import { Enums } from "#lib/client/prisma";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||
import { Enums } from "#lib/client/prisma.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 ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
@@ -21,7 +21,9 @@
|
||||
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000,
|
||||
[Enums.Ausweisart.VerbrauchsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: 250
|
||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: 0,
|
||||
[Enums.Ausweisart.GEGNachweisGewerbe]: 0,
|
||||
[Enums.Ausweisart.GEGNachweisWohnen]: 0,
|
||||
}[ausweisart];
|
||||
|
||||
/**
|
||||
@@ -64,9 +66,9 @@
|
||||
(async () => {
|
||||
let result;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
result = await endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
||||
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt);
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
|
||||
@@ -398,7 +398,6 @@
|
||||
{/if}
|
||||
|
||||
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
||||
<!-- TODO -->
|
||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||
<a
|
||||
class="button text-sm"
|
||||
@@ -409,6 +408,11 @@
|
||||
class="button text-sm"
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}"
|
||||
>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}
|
||||
|
||||
|
||||
@@ -1,113 +1,89 @@
|
||||
<script lang="ts">
|
||||
import { ripple } from "svelte-ripple-action";
|
||||
import type { RippleOptions } from "svelte-ripple-action/dist/constants.js";
|
||||
import { Reader, Bell, Gear, LockClosed, CaretDown } from "radix-svelte-icons"
|
||||
import {
|
||||
Reader,
|
||||
Bell,
|
||||
Gear,
|
||||
LockClosed,
|
||||
CaretDown,
|
||||
} from "radix-svelte-icons";
|
||||
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
||||
import DashboardNotification from "./DashboardNotification.svelte";
|
||||
import { notifications } from "#components/NotificationProvider/shared.js";
|
||||
import ThemeController from "#components/ThemeController.svelte";
|
||||
import { BenutzerClient, ObjektKomplettClient } from "#components/Ausweis/types.js";
|
||||
|
||||
import {
|
||||
BenutzerClient,
|
||||
ObjektKomplettClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
|
||||
export let lightTheme: boolean;
|
||||
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>
|
||||
|
||||
<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 px-4">
|
||||
|
||||
<aside class="rounded-lg bg-white box px-6 py-5">
|
||||
<div class="flex flex-row items-center">
|
||||
<div class="flex flex-row mr-6">
|
||||
<a href="/"><img src="/images/header/logo-IBC-big.svg" class="h-16" alt="IBCornelsen - Logo"/></a>
|
||||
<a href="/"
|
||||
><img
|
||||
src="/images/header/logo-IBC-big.svg"
|
||||
class="h-16"
|
||||
alt="IBCornelsen - Logo"
|
||||
/></a
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="flex-col items-end">
|
||||
<div class="text-base-content font-semibold text-left flex"
|
||||
>{benutzer.vorname} {benutzer.name}</div>
|
||||
<div class="text-base-content font-semibold text-left flex">
|
||||
{benutzer.vorname}
|
||||
{benutzer.name}
|
||||
</div>
|
||||
<div class="text-base-content text-sm flex">{benutzer.email}</div>
|
||||
<a href="/auth/logout" class="text-xs">Logout</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard">
|
||||
<a class="button-tab" href="/dashboard">
|
||||
<Reader width={22} height={22} />
|
||||
Vorgänge
|
||||
</a>
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard">
|
||||
<a class="button-tab" href="/dashboard">
|
||||
<Reader width={22} height={22} />
|
||||
Inbox
|
||||
</a>
|
||||
|
||||
<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> -->
|
||||
<hr class="border-gray-600" />
|
||||
{#if benutzer.rolle === "ADMIN"}
|
||||
<li><details class="[&_.caret]:open:rotate-180" open>
|
||||
<summary class="button-tab w-full outline-0 hover:outline-0 cursor-pointer">
|
||||
<LockClosed width={22} height={22} />
|
||||
Admin <CaretDown size={24} class="caret ml-auto transition-transform"></CaretDown></summary>
|
||||
<ul>
|
||||
<li>
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/ausweise-pruefen">
|
||||
Ausweise Prüfen
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/impersonate-user">
|
||||
Impersonate User
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</details></li>
|
||||
<li>
|
||||
<details class="[&_.caret]:open:rotate-180" open>
|
||||
<summary
|
||||
class="button-tab w-full outline-0 hover:outline-0 cursor-pointer"
|
||||
>
|
||||
<LockClosed width={22} height={22} />
|
||||
Admin <CaretDown
|
||||
size={24}
|
||||
class="caret ml-auto transition-transform"
|
||||
></CaretDown></summary
|
||||
>
|
||||
<ul>
|
||||
<li>
|
||||
<a
|
||||
class="button-tab"
|
||||
href="/dashboard/admin/ausweise-pruefen"
|
||||
>
|
||||
Ausweise Prüfen
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
class="button-tab"
|
||||
href="/dashboard/admin/impersonate-user"
|
||||
>
|
||||
Impersonate User
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</details>
|
||||
</li>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="mt-10 flex flex-col gap-4 px-8">
|
||||
@@ -116,18 +92,26 @@
|
||||
<div class="dropdown dropdown-top">
|
||||
<div class="indicator">
|
||||
{#if Object.keys($notifications).length > 0}
|
||||
<span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
|
||||
<span class="indicator-item badge badge-accent text-xs"
|
||||
>{Object.keys($notifications).length}</span
|
||||
>
|
||||
{/if}
|
||||
<button tabindex="0" class="hover:bg-gray-200 p-3 rounded-lg">
|
||||
<button
|
||||
tabindex="0"
|
||||
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||
>
|
||||
<Bell size={24} />
|
||||
</button>
|
||||
</div>
|
||||
<ul class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80">
|
||||
<ul
|
||||
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} />
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<a href="/dashboard/einstellungen"
|
||||
|
||||
<a
|
||||
href="/dashboard/einstellungen"
|
||||
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||
>
|
||||
<Gear size={24} />
|
||||
@@ -137,10 +121,8 @@
|
||||
<div class="divider px-8"></div>
|
||||
<a
|
||||
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"
|
||||
>
|
||||
|
||||
</a>
|
||||
</aside>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const BedarfsausweisGewerbeSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -20,6 +20,7 @@ export const BedarfsausweisGewerbeSchema = z.object({
|
||||
bauteilaktivierung: z.boolean().nullish(),
|
||||
klimatisierung: z.boolean().nullish(),
|
||||
nachweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const BedarfsausweisWohnenSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -86,6 +86,7 @@ export const BedarfsausweisWohnenSchema = z.object({
|
||||
pruefpunkt_geometrie: z.boolean().nullish(),
|
||||
pruefpunkt_fenster: z.boolean().nullish(),
|
||||
ausweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
rechnung_id: z.string().nullish(),
|
||||
aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"),
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const GEGNachweisGewerbeSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -10,6 +10,7 @@ export const GEGNachweisGewerbeSchema = z.object({
|
||||
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(),
|
||||
nachweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const GEGNachweisWohnenSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -10,6 +10,7 @@ export const GEGNachweisWohnenSchema = z.object({
|
||||
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(),
|
||||
nachweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const VerbrauchsausweisGewerbeSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -52,6 +52,7 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
ausweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
pruefpunkt_heizungsalter: z.boolean().nullish(),
|
||||
pruefpunkt_verbrauch_niedrig: z.boolean().nullish(),
|
||||
pruefpunkt_verbrauch_hoch: z.boolean().nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const VerbrauchsausweisWohnenSchema = z.object({
|
||||
id: z.string().describe("ID des Ausweises"),
|
||||
@@ -38,6 +38,7 @@ export const VerbrauchsausweisWohnenSchema = z.object({
|
||||
beschreibung: z.string().nullish(),
|
||||
kontrolldatei_angefragt: z.boolean().describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde").nullish(),
|
||||
ausweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
pruefpunkt_heizungsalter: z.boolean().nullish(),
|
||||
|
||||
@@ -3,22 +3,19 @@
|
||||
import "../style/global.css";
|
||||
import "../../svelte-dialogs.config.js";
|
||||
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
import { BenutzerClient, ObjektClient } from "#components/Ausweis/types";
|
||||
|
||||
const valid = validateAccessTokenServer(Astro)
|
||||
|
||||
if (!valid) {
|
||||
Astro.redirect("/auth/login", 302)
|
||||
}
|
||||
import { BenutzerClient } from "#components/Ausweis/types";
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
user: BenutzerClient
|
||||
user: BenutzerClient;
|
||||
}
|
||||
|
||||
const { title, user } = Astro.props;
|
||||
|
||||
if (!user) {
|
||||
Astro.redirect("/auth/login", 302);
|
||||
}
|
||||
|
||||
const schema = JSON.stringify({
|
||||
"@context": "http://schema.org",
|
||||
"@type": "Corporation",
|
||||
@@ -53,22 +50,22 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
if (import.meta.env.PROD) {
|
||||
H.init("1jdkoe52", {
|
||||
serviceName: "online-energieausweis",
|
||||
backendUrl: "https://highlight-backend.online-energieausweis.org/public",
|
||||
backendUrl:
|
||||
"https://highlight-backend.online-energieausweis.org/public",
|
||||
tracingOrigins: true,
|
||||
networkRecording: {
|
||||
enabled: true,
|
||||
recordHeadersAndBody: true
|
||||
}
|
||||
})
|
||||
recordHeadersAndBody: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<script type="application/ld+json" set:html={schema}></script>
|
||||
<script type="application/ld+json" set:html={schema} />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
|
||||
|
||||
<meta
|
||||
@@ -112,7 +109,6 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<main
|
||||
class="p-0 grid max-w-[1920px]
|
||||
xs:grid-cols-[minmax(1fr,1fr)] xs:gap-1 xs:p-0
|
||||
@@ -122,16 +118,15 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
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"
|
||||
>
|
||||
<DashboardSidebar
|
||||
lightTheme={lightTheme}
|
||||
benutzer={user}
|
||||
client:load
|
||||
/>
|
||||
|
||||
<DashboardSidebar lightTheme={lightTheme} benutzer={user} client:load>
|
||||
</DashboardSidebar>
|
||||
|
||||
<article class="box rounded-tl-none
|
||||
xl:px-10 py-8">
|
||||
<slot />
|
||||
</article>
|
||||
|
||||
<article class="box px-6 py-5 h-screen">
|
||||
<slot />
|
||||
</article>
|
||||
</main>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -30,7 +30,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
const form = pdf.getForm()
|
||||
form.updateFieldAppearances(font)
|
||||
|
||||
pages[0].drawText(`ID: ${aufnahme.id || ""}`, {
|
||||
pages[0].drawText(`ID: ${ausweis.id || ""}`, {
|
||||
x: 211,
|
||||
y: height - 112.5,
|
||||
size: 10
|
||||
@@ -116,7 +116,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
|
||||
addCheckMark(pages[0], 213, height - 345)
|
||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
|
||||
addCheckMark(pages[0], 355, height - 334)
|
||||
addCheckMark(pages[0], 355, height - 334)
|
||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
|
||||
addCheckMark(pages[0], 355, height - 345)
|
||||
}
|
||||
@@ -213,15 +213,20 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
|
||||
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => {
|
||||
const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64"))
|
||||
const pfeilNachOben = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-oben.png", import.meta.url), "base64"))
|
||||
|
||||
// Wir müssen den berechneten Wert zwischen 0 und 1000 als Wert zwischen 0 und 1 festlegen
|
||||
const endenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 1000
|
||||
const 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 maxTranslation = 512
|
||||
const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage;
|
||||
const stromVerbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * stromVerbrauchTranslationPercentage;
|
||||
const vergleichsWertWaermeTranslationX = minTranslation + (maxTranslation - minTranslation) * vergleichsWertWaermeTranslationPercentage;
|
||||
const vergleichsWertStromTranslationX = minTranslation + (maxTranslation - minTranslation) * vergleichsWertStromTranslationPercentage;
|
||||
|
||||
const pfeilWidth = 20
|
||||
const margin = 5;
|
||||
@@ -233,8 +238,17 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
height: 30
|
||||
})
|
||||
|
||||
page.drawImage(pfeilNachOben, {
|
||||
x: vergleichsWertWaermeTranslationX,
|
||||
y: height - 293,
|
||||
width: pfeilWidth,
|
||||
height: 30
|
||||
})
|
||||
|
||||
const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.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) {
|
||||
page.drawText("Endenergieverbrauch Wärme", {
|
||||
@@ -263,6 +277,33 @@ 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, {
|
||||
x: stromVerbrauchTranslationX,
|
||||
y: height - 354,
|
||||
@@ -270,6 +311,13 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
height: 30
|
||||
})
|
||||
|
||||
page.drawImage(pfeilNachOben, {
|
||||
x: vergleichsWertStromTranslationX,
|
||||
y: height - 437,
|
||||
width: pfeilWidth,
|
||||
height: 30
|
||||
})
|
||||
|
||||
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
||||
page.drawText("Endenergieverbrauch Strom", {
|
||||
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10),
|
||||
@@ -296,16 +344,43 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
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])
|
||||
|
||||
if (ausweis.warmwasser_enthalten) {
|
||||
addCheckMark(pages[2], 41, height - 269)
|
||||
addCheckMark(pages[2], 41, height - 293)
|
||||
}
|
||||
|
||||
if (ausweis.kuehlung_enthalten) {
|
||||
addCheckMark(pages[2], 41, height - 281)
|
||||
addCheckMark(pages[2], 41, height - 305)
|
||||
}
|
||||
|
||||
if (ausweis.stromverbrauch_enthaelt_heizung) {
|
||||
|
||||
@@ -28,7 +28,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
const font = await pdf.embedFont(StandardFonts.Helvetica)
|
||||
const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
|
||||
|
||||
pages[0].drawText(`ID: ${aufnahme.id || ""}`, {
|
||||
pages[0].drawText(`ID: ${ausweis.id || ""}`, {
|
||||
x: 211,
|
||||
y: height - 112.5,
|
||||
size: 10
|
||||
|
||||
Binary file not shown.
@@ -28,6 +28,8 @@ export async function getVerbrauchsausweisWohnenKomplett(id: string) {
|
||||
})
|
||||
}
|
||||
|
||||
export type VerbrauchsausweisWohnenKomplett = Awaited<ReturnType<typeof getVerbrauchsausweisWohnenKomplett>>;
|
||||
|
||||
export async function getVerbrauchsausweisGewerbe(id: string): Promise<VerbrauchsausweisGewerbe | null> {
|
||||
return await prisma.verbrauchsausweisGewerbe.findUnique({
|
||||
where: {
|
||||
|
||||
@@ -1,37 +1,52 @@
|
||||
import { getAusweisartFromId } from "#components/Ausweis/types.js";
|
||||
import moment from "moment";
|
||||
import { createLexOfficeCustomer } from "./lexoffice.js";
|
||||
import { Enums, prisma, Rechnung, VerbrauchsausweisWohnen } from "./prisma.js";
|
||||
import { Enums, prisma, Rechnung } from "./prisma.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) {
|
||||
return {
|
||||
"type": "custom",
|
||||
"name": name,
|
||||
"description": "",
|
||||
"quantity": 1,
|
||||
"lineItemAmount": preis,
|
||||
"unitName": name,
|
||||
"unitPrice": {
|
||||
"currency": "EUR",
|
||||
"grossAmount": preis,
|
||||
"taxRatePercentage": steuer
|
||||
}
|
||||
type: "custom",
|
||||
name: name,
|
||||
description: "",
|
||||
quantity: 1,
|
||||
lineItemAmount: preis,
|
||||
unitName: name,
|
||||
unitPrice: {
|
||||
currency: "EUR",
|
||||
grossAmount: preis,
|
||||
taxRatePercentage: steuer,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function addedServicesNeu(data: any, rechnung: Rechnung, steuer: number){
|
||||
if (rechnung.services.includes(Enums.Service.Qualitaetsdruck)){
|
||||
data["lineItems"].push(createLineItem('Zusatzservice Postversand', 9, steuer))
|
||||
type LineItem = ReturnType<typeof createLineItem>;
|
||||
|
||||
export function addedServicesNeu(
|
||||
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)){
|
||||
data["lineItems"].push(createLineItem('Zusatzservice Aushang', 10, steuer))
|
||||
if (rechnung.services.includes(Enums.Service.Aushang)) {
|
||||
data["lineItems"].push(
|
||||
createLineItem("Zusatzservice Aushang", 10, steuer)
|
||||
);
|
||||
}
|
||||
if (rechnung.services.includes(Enums.Service.SameDay)){
|
||||
data["lineItems"].push(createLineItem('Zusatzservice Same Day Service', 29, steuer))
|
||||
if (rechnung.services.includes(Enums.Service.SameDay)) {
|
||||
data["lineItems"].push(
|
||||
createLineItem("Zusatzservice Same Day Service", 29, steuer)
|
||||
);
|
||||
}
|
||||
if (rechnung.services.includes(Enums.Service.Telefonberatung)){
|
||||
data["lineItems"].push(createLineItem('Zusatzservice Telefonische Beratung', 75, steuer))
|
||||
if (rechnung.services.includes(Enums.Service.Telefonberatung)) {
|
||||
data["lineItems"].push(
|
||||
createLineItem("Zusatzservice Telefonische Beratung", 75, steuer)
|
||||
);
|
||||
}
|
||||
|
||||
return data;
|
||||
@@ -45,17 +60,24 @@ export function addedServicesNeu(data: any, rechnung: Rechnung, steuer: number){
|
||||
* @return array
|
||||
* @throws Error
|
||||
*/
|
||||
export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung: Rechnung) {
|
||||
export async function createInvoice(
|
||||
ausweis: VerbrauchsausweisWohnenKomplett,
|
||||
rechnung: Rechnung
|
||||
) {
|
||||
if (!ausweis) {
|
||||
throw new Error("Ausweis ist null");
|
||||
}
|
||||
|
||||
if (!ausweis.benutzer_id) {
|
||||
throw new Error("Benutzer ist nicht vorhanden")
|
||||
throw new Error("Benutzer ist nicht vorhanden");
|
||||
}
|
||||
|
||||
const user = await prisma.benutzer.findUnique({
|
||||
where: {
|
||||
id: ausweis.benutzer_id
|
||||
}
|
||||
})
|
||||
|
||||
id: ausweis.benutzer_id,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
throw new Error("Nutzer existiert nicht!");
|
||||
} else if (user.lex_office_id == null) {
|
||||
@@ -63,129 +85,198 @@ export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung:
|
||||
const lex_office_id = await createLexOfficeCustomer(user);
|
||||
|
||||
user.lex_office_id = lex_office_id;
|
||||
|
||||
|
||||
await prisma.benutzer.update({
|
||||
where: {
|
||||
id: user.id
|
||||
id: user.id,
|
||||
},
|
||||
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 = {
|
||||
"voucherDate": moment().format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
|
||||
"taxConditions": {
|
||||
"taxType": "gross"
|
||||
voucherDate: moment().format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
|
||||
taxConditions: {
|
||||
taxType: "gross",
|
||||
},
|
||||
"shippingConditions": {
|
||||
"shippingType": "none"
|
||||
shippingConditions: {
|
||||
shippingType: "none",
|
||||
},
|
||||
"address": {
|
||||
"contactId": user.lex_office_id,
|
||||
"name": rechnung.empfaenger || "----",
|
||||
"street": rechnung.strasse,
|
||||
"city": rechnung.ort,
|
||||
"zip": rechnung.plz,
|
||||
"countryCode": "DE",
|
||||
"supplement": rechnung.zusatzzeile
|
||||
address: {
|
||||
contactId: user.lex_office_id,
|
||||
name: rechnung.empfaenger || "----",
|
||||
street: rechnung.strasse,
|
||||
city: rechnung.ort,
|
||||
zip: rechnung.plz,
|
||||
countryCode: "DE",
|
||||
supplement: rechnung.zusatzzeile,
|
||||
},
|
||||
"lineItems": [],
|
||||
"totalPrice": {
|
||||
"currency": "EUR",
|
||||
"totalGrossAmount": rechnung.betrag,
|
||||
lineItems: [] as LineItem[],
|
||||
totalPrice: {
|
||||
currency: "EUR",
|
||||
totalGrossAmount: rechnung.betrag,
|
||||
},
|
||||
"title": "Rechnung",
|
||||
"introduction": "Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung",
|
||||
"remark": "Vielen Dank für Ihren Einkauf."
|
||||
title: "Rechnung",
|
||||
introduction:
|
||||
"Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung",
|
||||
remark: "Vielen Dank für Ihren Einkauf.",
|
||||
};
|
||||
|
||||
if (rechnung.status == Enums.Rechnungsstatus.paid) {
|
||||
const types = {
|
||||
[Enums.Bezahlmethoden.paypal]: "PayPal",
|
||||
[Enums.Bezahlmethoden.creditcard]: "Kreditkarte",
|
||||
[Enums.Bezahlmethoden.sofort]: "Sofortüberweisung",
|
||||
[Enums.Bezahlmethoden.giropay]: "Giropay",
|
||||
const types: Record<Enums.Bezahlmethoden, string> = {
|
||||
[Enums.Bezahlmethoden.paypal]: "PayPal",
|
||||
[Enums.Bezahlmethoden.creditcard]: "Kreditkarte",
|
||||
[Enums.Bezahlmethoden.sofort]: "Sofortüberweisung",
|
||||
[Enums.Bezahlmethoden.giropay]: "Giropay",
|
||||
[Enums.Bezahlmethoden.rechnung]: "Rechnung",
|
||||
};
|
||||
|
||||
const type = types[rechnung.bezahlmethode];
|
||||
|
||||
data["introduction"] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`;
|
||||
data[
|
||||
"introduction"
|
||||
] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`;
|
||||
}
|
||||
|
||||
const tax_rate = 19;
|
||||
|
||||
if (rechnung.betrag == 15) {
|
||||
// Korrektur alleinstehend
|
||||
data["lineItems"].push(createLineItem("Service Korrektur anfordern", rechnung.betrag, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem("Service Korrektur anfordern", rechnung.betrag, 19)
|
||||
);
|
||||
} else if (rechnung.betrag == 476) {
|
||||
data["lineItems"].push(createLineItem("GEG Berechnung Wohngebäude", rechnung.betrag, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem("GEG Berechnung Wohngebäude", rechnung.betrag, 19)
|
||||
);
|
||||
} else if (rechnung.betrag > 400 && rechnung.betrag != 476) {
|
||||
data["lineItems"].push(createLineItem("Bedarfsausweis Gewerbe", rechnung.betrag, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem("Bedarfsausweis Gewerbe", rechnung.betrag, 19)
|
||||
);
|
||||
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
|
||||
data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Verbrauchsausweis Online (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisWohnen.Standard,
|
||||
19
|
||||
)
|
||||
);
|
||||
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
|
||||
data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Verbrauchsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisWohnen.Beratung,
|
||||
19
|
||||
)
|
||||
);
|
||||
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
|
||||
data["lineItems"].push(createLineItem(`Verbrauchsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Verbrauchsausweis Offline (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisWohnen.Offline,
|
||||
19
|
||||
)
|
||||
);
|
||||
}
|
||||
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
|
||||
data["lineItems"].push(createLineItem(`Bedarfsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Bedarfsausweis Online (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisWohnen.Standard,
|
||||
19
|
||||
)
|
||||
);
|
||||
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
|
||||
data["lineItems"].push(createLineItem(`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisWohnen.Beratung,
|
||||
19
|
||||
)
|
||||
);
|
||||
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
|
||||
data["lineItems"].push(createLineItem(`Bedarfsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Bedarfsausweis Offline (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisWohnen.Offline,
|
||||
19
|
||||
)
|
||||
);
|
||||
}
|
||||
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
|
||||
data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Standard, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Verbrauchsausweis Nichtwohngebäude Online (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisGewerbe.Standard,
|
||||
19
|
||||
)
|
||||
);
|
||||
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
|
||||
data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Beratung, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Verbrauchsausweis Nichtwohngebäude Online (Vorprüfung negativ) (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisGewerbe.Beratung,
|
||||
19
|
||||
)
|
||||
);
|
||||
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
|
||||
data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Offline, 19));
|
||||
data["lineItems"].push(
|
||||
createLineItem(
|
||||
`Verbrauchsausweis Nichtwohngebäude Offline (ID ${ausweis.id})`,
|
||||
PRICES.VerbrauchsausweisGewerbe.Offline,
|
||||
19
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
data = addedServicesNeu(data, rechnung, 19);
|
||||
|
||||
|
||||
const response = await fetch("https://api.lexoffice.io/v1/invoices?finalize=true", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
Accept: `application/json`,
|
||||
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: JSON.stringify(data)
|
||||
})
|
||||
const response = await fetch(
|
||||
"https://api.lexoffice.io/v1/invoices?finalize=true",
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
Accept: `application/json`,
|
||||
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(data),
|
||||
}
|
||||
);
|
||||
|
||||
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.
|
||||
const response_id = invoice["id"];
|
||||
|
||||
const request = await fetch(`https://api.lexoffice.io/v1/invoices/${response_id}`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: `application/json`,
|
||||
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||
"Content-Type": "application/json"
|
||||
const request = await fetch(
|
||||
`https://api.lexoffice.io/v1/invoices/${response_id}`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
Accept: `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 {
|
||||
id: invoice["id"],
|
||||
voucherNumber: abfrage_response["voucherNumber"]
|
||||
}
|
||||
}
|
||||
voucherNumber: abfrage_response["voucherNumber"],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
import "../../style/formular.css";
|
||||
import {
|
||||
BenutzerClient,
|
||||
ObjektClient,
|
||||
ObjektKomplettClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
import DashboardObjekt from "#components/Dashboard/DashboardObjekt.svelte";
|
||||
@@ -14,10 +13,7 @@
|
||||
import Cookies from "js-cookie";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import Pagination from "#components/Pagination.svelte";
|
||||
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";
|
||||
import { Enums, Objekt } from "#lib/client/prisma.js";
|
||||
|
||||
export let user: BenutzerClient;
|
||||
export let objekte: ObjektKomplettClient[];
|
||||
@@ -26,7 +22,7 @@
|
||||
|
||||
let objektOverlayHidden = true;
|
||||
|
||||
let objekt: Omit<ObjektClient, "uid"> = {
|
||||
let objekt: Objekt = {
|
||||
adresse: "",
|
||||
erstellungsdatum: new Date(),
|
||||
latitude: 0,
|
||||
@@ -91,8 +87,6 @@
|
||||
|
||||
objekte = objekte
|
||||
}
|
||||
let filters: { name: keyof z.infer<typeof filterAusweise>, type: ZodTypeAny, value: any }[] = []
|
||||
|
||||
export let id: string = "";
|
||||
</script>
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<span>{user.vorname} {user.name}</span>
|
||||
<span class="text-xs">{user.email}</span>
|
||||
</div>
|
||||
<a href="/dashboard/admin/impersonate?uid={user.uid}" class="button text-sm">Einloggen</a>
|
||||
<a href="/dashboard/admin/impersonate?id={user.id}" class="button text-sm">Einloggen</a>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
import { getMaximumDevitationInPercent } from "#client/lib/helpers.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_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 ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
@@ -394,33 +396,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 =
|
||||
ausweisart === Enums.Ausweisart.GEGNachweisWohnen ||
|
||||
ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe ||
|
||||
@@ -924,7 +899,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>
|
||||
|
||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||
{@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt)}
|
||||
{@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt)}
|
||||
|
||||
{#await request}
|
||||
|
||||
|
||||
@@ -20,7 +20,11 @@ import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||
import { s3Client } from "#lib/s3.js";
|
||||
import { createInvoice } from "#lib/server/invoice.js";
|
||||
import { tryCatch } from "#lib/tryCatch.js";
|
||||
import { getBedarfsausweisWohnenKomplett, getVerbrauchsausweisGewerbeKomplett, getVerbrauchsausweisWohnenKomplett } from "#lib/server/db.js";
|
||||
import {
|
||||
getBedarfsausweisWohnenKomplett,
|
||||
getVerbrauchsausweisGewerbeKomplett,
|
||||
getVerbrauchsausweisWohnenKomplett,
|
||||
} from "#lib/server/db.js";
|
||||
|
||||
export const GET = defineApiRoute({
|
||||
input: z.object({
|
||||
@@ -40,18 +44,18 @@ export const GET = defineApiRoute({
|
||||
aufnahme: Aufnahme & {
|
||||
bilder: Bild[];
|
||||
objekt: Objekt & {
|
||||
benutzer: Benutzer;
|
||||
benutzer: Benutzer | null;
|
||||
};
|
||||
};
|
||||
})
|
||||
| null = null;
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis)
|
||||
ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis)
|
||||
ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis);
|
||||
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis)
|
||||
ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis);
|
||||
}
|
||||
|
||||
if (!ausweis) {
|
||||
@@ -81,22 +85,24 @@ export const GET = defineApiRoute({
|
||||
}
|
||||
|
||||
if (!rechnung.lex_office_id) {
|
||||
const [result, error] = await tryCatch(createInvoice(ausweis, rechnung));
|
||||
const [result, error] = await tryCatch(
|
||||
createInvoice(ausweis, rechnung)
|
||||
);
|
||||
|
||||
if (error) {
|
||||
return
|
||||
return;
|
||||
}
|
||||
|
||||
const { id, voucherNumber } = result;
|
||||
|
||||
await prisma.rechnung.update({
|
||||
where: {
|
||||
id: rechnung.id
|
||||
id: rechnung.id,
|
||||
},
|
||||
data: {
|
||||
lex_office_id: id
|
||||
}
|
||||
})
|
||||
lex_office_id: id,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
const pdfAusweis = await getAnsichtsausweis(
|
||||
@@ -123,7 +129,7 @@ export const GET = defineApiRoute({
|
||||
ACL: "private",
|
||||
});
|
||||
|
||||
const response = await s3Client.send(command);
|
||||
await s3Client.send(command);
|
||||
}
|
||||
|
||||
if (pdfDatenblatt) {
|
||||
@@ -134,7 +140,7 @@ export const GET = defineApiRoute({
|
||||
ACL: "private",
|
||||
});
|
||||
|
||||
const response = await s3Client.send(command);
|
||||
await s3Client.send(command);
|
||||
}
|
||||
|
||||
let text: string;
|
||||
@@ -230,30 +236,30 @@ fax 040 · 209339859
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
await prisma.verbrauchsausweisWohnen.update({
|
||||
where: {
|
||||
id: ausweis.id
|
||||
},
|
||||
data: {
|
||||
ausgestellt: true
|
||||
}
|
||||
})
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
await prisma.verbrauchsausweisGewerbe.update({
|
||||
where: {
|
||||
id: ausweis.id
|
||||
},
|
||||
data: {
|
||||
ausgestellt: true
|
||||
}
|
||||
})
|
||||
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
await prisma.bedarfsausweisWohnen.update({
|
||||
where: {
|
||||
id: ausweis.id
|
||||
id: ausweis.id,
|
||||
},
|
||||
data: {
|
||||
ausgestellt: true,
|
||||
}
|
||||
})
|
||||
},
|
||||
});
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
await prisma.verbrauchsausweisGewerbe.update({
|
||||
where: {
|
||||
id: ausweis.id,
|
||||
},
|
||||
data: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
});
|
||||
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
await prisma.bedarfsausweisWohnen.update({
|
||||
where: {
|
||||
id: ausweis.id,
|
||||
},
|
||||
data: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||
import { generatePrefixedId } from "#lib/db.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||
import { generatePrefixedId } from "#lib/db.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { BedarfsausweisWohnen, prisma } from "#lib/server/prisma.js";
|
||||
import { prisma } from "#lib/server/prisma.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
|
||||
import { z } from "zod";
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
zurueckgestellt: true,
|
||||
created_at: true,
|
||||
updated_at: true,
|
||||
storniert: true
|
||||
storniert: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -29,6 +29,7 @@ export const PUT = defineApiRoute({
|
||||
created_at: true,
|
||||
updated_at: true,
|
||||
storniert: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix,
|
||||
}),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||
import { generatePrefixedId } from "#lib/db.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -217,7 +217,7 @@ export const PUT = defineApiRoute({
|
||||
method: input.bezahlmethode as PaymentMethod,
|
||||
description: "Verbrauchsausweis Wohnen 2016",
|
||||
redirectUrl: `https://online-energieausweis.org/payment/success?a=${ausweis.id}&r=${rechnung.id}`,
|
||||
webhookUrl: `https://online-energieausweis.org/api/webhooks/mollie?uid=${rechnung.id}`,
|
||||
webhookUrl: `https://online-energieausweis.org/api/webhooks/mollie`,
|
||||
cancelUrl: `https://online-energieausweis.org/kundendaten?a=${ausweis.id}&r=${rechnung.id}`
|
||||
});
|
||||
|
||||
|
||||
@@ -14,7 +14,8 @@ export const PATCH = defineApiRoute({
|
||||
benutzer_id: true,
|
||||
aufnahme_id: true,
|
||||
updated_at: true,
|
||||
created_at: true
|
||||
created_at: true,
|
||||
ausweisart: true
|
||||
}).merge(z.object({
|
||||
startdatum: z.coerce.date().nullable(),
|
||||
})),
|
||||
|
||||
@@ -21,7 +21,8 @@ export const PUT = defineApiRoute({
|
||||
aufnahme_id: true,
|
||||
rechnung_id: true,
|
||||
updated_at: true,
|
||||
created_at: true
|
||||
created_at: true,
|
||||
ausweisart: true
|
||||
}).merge(z.object({
|
||||
startdatum: z.coerce.date().nullable()
|
||||
})),
|
||||
|
||||
@@ -15,7 +15,8 @@ export const PATCH = defineApiRoute({
|
||||
aufnahme_id: true,
|
||||
rechnung_id: true,
|
||||
created_at: true,
|
||||
updated_at: true
|
||||
updated_at: true,
|
||||
ausweisart: true
|
||||
}).merge(z.object({
|
||||
startdatum: z.coerce.date().nullable()
|
||||
})),
|
||||
|
||||
@@ -26,7 +26,8 @@ export const PUT = defineApiRoute({
|
||||
aufnahme_id: true,
|
||||
rechnung_id: true,
|
||||
created_at: true,
|
||||
updated_at: true
|
||||
updated_at: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -57,6 +57,7 @@ export const POST = defineApiRoute({
|
||||
data: {
|
||||
status: payment.status as Enums.Rechnungsstatus,
|
||||
transaktions_referenz: payment.id,
|
||||
bezahlt_am: new Date()
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
@@ -10,7 +10,6 @@ import ImpersonateUserModule from "#modules/ImpersonateUserModule.svelte";
|
||||
const caller = createCaller(Astro)
|
||||
|
||||
const params = Astro.params;
|
||||
const page = Number(params.page)
|
||||
|
||||
const user = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
|
||||
@@ -22,15 +22,15 @@ if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
|
||||
return Astro.redirect("/dashboard")
|
||||
}
|
||||
|
||||
const uid = Astro.url.searchParams.get("uid")
|
||||
const id = Astro.url.searchParams.get("id")
|
||||
|
||||
if (!uid) {
|
||||
if (!id) {
|
||||
return Astro.redirect("/404")
|
||||
}
|
||||
|
||||
const searchedUser = await prisma.benutzer.findUnique({
|
||||
where: {
|
||||
uid
|
||||
id
|
||||
}
|
||||
})
|
||||
|
||||
@@ -40,12 +40,12 @@ if (!searchedUser) {
|
||||
|
||||
const refreshTokenExpiry = moment().add(30, "days");
|
||||
const accessToken = encodeToken({
|
||||
uid: searchedUser.uid,
|
||||
id: searchedUser.id,
|
||||
typ: TokenType.Access,
|
||||
exp: moment().add(30, "minutes").valueOf(),
|
||||
});
|
||||
const refreshToken = encodeToken({
|
||||
uid: searchedUser.uid,
|
||||
id: searchedUser.id,
|
||||
typ: TokenType.Refresh,
|
||||
exp: refreshTokenExpiry.valueOf(),
|
||||
});
|
||||
@@ -60,7 +60,6 @@ Astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, accessToken, {
|
||||
path: "/",
|
||||
expires: moment().add(30, "minutes").toDate()
|
||||
})
|
||||
Astro.cookies.set("uid", searchedUser.uid)
|
||||
|
||||
return Astro.redirect("/dashboard")
|
||||
---
|
||||
@@ -1,23 +1,15 @@
|
||||
---
|
||||
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { Enums, prisma } from "#lib/server/prisma";
|
||||
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||
|
||||
const caller = createCaller(Astro)
|
||||
import { getCurrentUser } from "#lib/server/user";
|
||||
|
||||
const params = Astro.params;
|
||||
const page = Number(params.page)
|
||||
|
||||
const id = Astro.url.searchParams.get("id") || undefined;
|
||||
|
||||
|
||||
const user = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
}
|
||||
});
|
||||
const user = await getCurrentUser(Astro)
|
||||
|
||||
if (!user) {
|
||||
return Astro.redirect("/auth/login")
|
||||
|
||||
Reference in New Issue
Block a user