diff --git a/.github/workflows/dev-pipeline.yml b/.github/workflows/dev-pipeline.yml
index 4446c5a3..c0de330f 100644
--- a/.github/workflows/dev-pipeline.yml
+++ b/.github/workflows/dev-pipeline.yml
@@ -1,10 +1,10 @@
-name: Dev Pipeline
+name: Development Pipeline
on:
pull_request:
- branches: [main]
+ branches: [dev]
push:
- branches: [main]
+ branches: [dev]
jobs:
deploy:
@@ -26,8 +26,8 @@ jobs:
export PATH=$HOME/.nvm/versions/node/v22.14.0/bin:$PATH
echo $PATH
cd ~/online-energieausweis
- git reset --hard origin/main
+ git reset --hard origin/dev
git clean -f -d
- git pull origin main
+ git pull origin dev
git status
make prod
\ No newline at end of file
diff --git a/.github/workflows/prod-pipeline.yml b/.github/workflows/prod-pipeline.yml
new file mode 100644
index 00000000..261b8b90
--- /dev/null
+++ b/.github/workflows/prod-pipeline.yml
@@ -0,0 +1,31 @@
+name: Production Pipeline
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install Bun
+ run: |
+ curl -fsSL https://bun.sh/install | bash
+
+ - uses: appleboy/ssh-action@master
+ with:
+ host: ${{ secrets.PROD_HOST }}
+ username: ${{ secrets.PROD_USERNAME }}
+ password: ${{ secrets.PROD_PASSWORD }}
+ port: 22
+ script: |
+ export PATH=$HOME/.bun/bin:$PATH
+ export PATH=$HOME/.nvm/versions/node/v22.14.0/bin:$PATH
+ echo $PATH
+ cd ~/online-energieausweis
+ git reset --hard origin/main
+ git clean -f -d
+ git pull origin main
+ git status
+ make prod
\ No newline at end of file
diff --git a/backup-database.bash b/backup-database.bash
index 420566aa..dca6ef52 100644
--- a/backup-database.bash
+++ b/backup-database.bash
@@ -2,20 +2,27 @@
FILE_NAME=data-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br
FILE_NAME_COMPLETE=full-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br
-# Wir exportieren die Datenbank und komprimieren sie.
-docker exec -t online-energieausweis-database-1 pg_dump --data-only -U main main | brotli --best > $FILE_NAME
-docker exec -t online-energieausweis-database-1 pg_dumpall -c -U main | brotli --best > $FILE_NAME_COMPLETE
# Das wird benötigt für AWS Ionos Kompatibilität.
export AWS_REQUEST_CHECKSUM_CALCULATION=when_required
export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required
+# Wir exportieren die Datenbank und komprimieren sie.
# IMPORTANT: Dieser Befehl benötigt das `ionos` Profil, sonst wird er nicht funktionieren.
# Das Profil kann mit `aws configure --profile ionos` erstellt werden.
# Den Key dafür findet man auf https://dcd.ionos.com/latest/?lang=en#/key-management
+docker exec -t online-energieausweis-database-1 pg_dump --data-only -U main main | brotli --best > $FILE_NAME
+
aws s3 cp $FILE_NAME s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD
+
+echo "Uploaded $FILE_NAME"
+
+docker exec -t online-energieausweis-database-1 pg_dumpall -c -U main | brotli --best > $FILE_NAME_COMPLETE
+
aws s3 cp $FILE_NAME_COMPLETE s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD
+echo "Uploaded $FILE_NAME_COMPLETE"
+
# Wir entfernen das Backup
rm $FILE_NAME
rm $FILE_NAME_COMPLETE
\ No newline at end of file
diff --git a/package.json b/package.json
index 93239d0c..f2cc686e 100644
--- a/package.json
+++ b/package.json
@@ -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",
diff --git a/prisma/migrations/20250409152238_ausweis_id/migration.sql b/prisma/migrations/20250409152238_ausweis_id/migration.sql
new file mode 100644
index 00000000..eb2b5b04
--- /dev/null
+++ b/prisma/migrations/20250409152238_ausweis_id/migration.sql
@@ -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';
diff --git a/prisma/schema/BedarfsausweisGewerbe.prisma b/prisma/schema/BedarfsausweisGewerbe.prisma
index 476c21f7..bc4d983a 100644
--- a/prisma/schema/BedarfsausweisGewerbe.prisma
+++ b/prisma/schema/BedarfsausweisGewerbe.prisma
@@ -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())
diff --git a/prisma/schema/BedarfsausweisWohnen.prisma b/prisma/schema/BedarfsausweisWohnen.prisma
index 3a05d2b5..e3074294 100644
--- a/prisma/schema/BedarfsausweisWohnen.prisma
+++ b/prisma/schema/BedarfsausweisWohnen.prisma
@@ -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)
diff --git a/prisma/schema/GEGNachweisGewerbe.prisma b/prisma/schema/GEGNachweisGewerbe.prisma
index 8bff4bdf..3a344706 100644
--- a/prisma/schema/GEGNachweisGewerbe.prisma
+++ b/prisma/schema/GEGNachweisGewerbe.prisma
@@ -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())
diff --git a/prisma/schema/GEGNachweisWohnen.prisma b/prisma/schema/GEGNachweisWohnen.prisma
index 57a16db5..974b696c 100644
--- a/prisma/schema/GEGNachweisWohnen.prisma
+++ b/prisma/schema/GEGNachweisWohnen.prisma
@@ -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())
diff --git a/prisma/schema/VerbrauchsausweisGewerbe.prisma b/prisma/schema/VerbrauchsausweisGewerbe.prisma
index 43811388..9281dd18 100644
--- a/prisma/schema/VerbrauchsausweisGewerbe.prisma
+++ b/prisma/schema/VerbrauchsausweisGewerbe.prisma
@@ -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)
diff --git a/prisma/schema/VerbrauchsausweisWohnen.prisma b/prisma/schema/VerbrauchsausweisWohnen.prisma
index a741aa90..2f93801c 100644
--- a/prisma/schema/VerbrauchsausweisWohnen.prisma
+++ b/prisma/schema/VerbrauchsausweisWohnen.prisma
@@ -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())
diff --git a/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf b/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf
index c5734609..476ccc13 100644
Binary files a/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf and b/public/pdf/templates/GEG24_Nichtwohngebaeude.pdf differ
diff --git a/recover-db-dev.bash b/recover-db-dev.bash
new file mode 100644
index 00000000..e7b58155
--- /dev/null
+++ b/recover-db-dev.bash
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# === Configuration ===
+BUCKET_NAME="ibc-db-backup"
+ENDPOINT_URL="https://s3-eu-central-1.ionoscloud.com"
+LOCAL_DOWNLOAD_DIR="./" # Where to save the file
+
+# === Get latest file from IONOS S3 bucket ===
+LATEST_FILE=$(aws s3api list-objects-v2 \
+ --bucket "$BUCKET_NAME" \
+ --prefix "data-dump" \
+ --endpoint-url "$ENDPOINT_URL" \
+ --query 'Contents | sort_by(@, &LastModified) | [-1].Key' \
+ --output text)
+
+# === Check if file was found ===
+if [ "$LATEST_FILE" == "None" ] || [ -z "$LATEST_FILE" ]; then
+ echo "❌ No matching .sql.br file found."
+ exit 1
+fi
+
+FILENAME=$(basename "$LATEST_FILE")
+SQL_FILE="${FILENAME%.br}" # Remove .br suffix
+
+echo "📥 Downloading $LATEST_FILE"
+aws s3 cp "s3://$BUCKET_NAME/$LATEST_FILE" "$LOCAL_DOWNLOAD_DIR" \
+ --endpoint-url "$ENDPOINT_URL"
+
+# === Decompress with Brotli ===
+echo "🗜️ Decompressing $FILENAME -> $SQL_FILE"
+brotli -d "$FILENAME"
+
+# === Import into Postgres inside Docker ===
+echo "🐘 Importing into PostgreSQL (online-energieausweis-database-1:main)"
+docker exec -i "online-energieausweis-database-1" env PGPASSWORD="hHMP8cd^N3SnzGRR" \
+ psql -U "main" -d "main" < "$SQL_FILE"
+
+echo "✅ Import complete."
+
+# === Optional: Clean up
+rm "$FILENAME" "$SQL_FILE"
\ No newline at end of file
diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts
deleted file mode 100644
index 89d66c9f..00000000
--- a/src/astro-typesafe-api-caller.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { createCallerFactory } from "astro-typesafe-api/server";
-
-export const createCaller = createCallerFactory({
- "bild": await import("../src/pages/api/bild.ts"),
- "klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
- "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
- "unterlage": await import("../src/pages/api/unterlage.ts"),
- "aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
- "admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"),
- "admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"),
- "admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"),
- "admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"),
- "admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"),
- "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
- "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
- "auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
- "auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
- "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
- "ausweise": await import("../src/pages/api/ausweise/index.ts"),
- "aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
- "bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
- "bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
- "bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"),
- "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
- "bilder/[id]": await import("../src/pages/api/bilder/[id].ts"),
- "geg-nachweis-gewerbe/[id]": await import("../src/pages/api/geg-nachweis-gewerbe/[id].ts"),
- "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"),
- "geg-nachweis-wohnen/[id]": await import("../src/pages/api/geg-nachweis-wohnen/[id].ts"),
- "geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"),
- "objekt": await import("../src/pages/api/objekt/index.ts"),
- "rechnung/[id]": await import("../src/pages/api/rechnung/[id].ts"),
- "rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"),
- "rechnung": await import("../src/pages/api/rechnung/index.ts"),
- "ticket": await import("../src/pages/api/ticket/index.ts"),
- "user": await import("../src/pages/api/user/index.ts"),
- "user/self": await import("../src/pages/api/user/self.ts"),
- "verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"),
- "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
- "verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
- "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
- "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
- "verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
- "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
- "aufnahme/[id]/bilder": await import("../src/pages/api/aufnahme/[id]/bilder.ts"),
- "aufnahme/[id]": await import("../src/pages/api/aufnahme/[id]/index.ts"),
- "aufnahme/[id]/unterlagen": await import("../src/pages/api/aufnahme/[id]/unterlagen.ts"),
- "objekt/[id]": await import("../src/pages/api/objekt/[id]/index.ts"),
-})
\ No newline at end of file
diff --git a/src/client/lib/ausweisSpeichern.ts b/src/client/lib/ausweisSpeichern.ts
index 6362640d..3c93be7e 100644
--- a/src/client/lib/ausweisSpeichern.ts
+++ b/src/client/lib/ausweisSpeichern.ts
@@ -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(
diff --git a/src/components/Ausweis/PerformanceScore.svelte b/src/components/Ausweis/PerformanceScore.svelte
index a5dc68e0..5a40e520 100644
--- a/src/components/Ausweis/PerformanceScore.svelte
+++ b/src/components/Ausweis/PerformanceScore.svelte
@@ -1,5 +1,4 @@
-
-
-
-
+
+
-
+
-
{benutzer.vorname} {benutzer.name}
+
+ {benutzer.vorname}
+ {benutzer.name}
+
{benutzer.email}
Logout
-
-
+
Vorgänge
-
+
Inbox
-
-
-
-
-
+
{#if benutzer.rolle === "ADMIN"}
-
-
-
- Admin
-
-
+
+
+
+
+ Admin
+
+
+
{/if}
@@ -116,18 +92,26 @@
{#if Object.keys($notifications).length > 0}
- {Object.keys($notifications).length}
+ {Object.keys($notifications).length}
{/if}
-
+
-
-
-
@@ -137,10 +121,8 @@
-
diff --git a/src/components/Notifications/shared.ts b/src/components/Notifications/shared.ts
index fcba5b92..dd4ff9e7 100644
--- a/src/components/Notifications/shared.ts
+++ b/src/components/Notifications/shared.ts
@@ -28,6 +28,12 @@ export function updateNotification(uid: string, updater: Partial
)
value[uid] = { ...defaults, ...value[uid], ...updater } as Notification;
return value;
})
+
+ if (updater.timeout) {
+ setTimeout(() => {
+ deleteNotification(uid);
+ }, updater.timeout);
+ }
}
export function addNotification(notification: Partial): string {
diff --git a/src/generated/zod/bedarfsausweisgewerbe.ts b/src/generated/zod/bedarfsausweisgewerbe.ts
index c387134e..5eea5ecc 100644
--- a/src/generated/zod/bedarfsausweisgewerbe.ts
+++ b/src/generated/zod/bedarfsausweisgewerbe.ts
@@ -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(),
diff --git a/src/generated/zod/bedarfsausweiswohnen.ts b/src/generated/zod/bedarfsausweiswohnen.ts
index 2960c4cb..2abcdb06 100644
--- a/src/generated/zod/bedarfsausweiswohnen.ts
+++ b/src/generated/zod/bedarfsausweiswohnen.ts
@@ -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"),
})
diff --git a/src/generated/zod/gegnachweisgewerbe.ts b/src/generated/zod/gegnachweisgewerbe.ts
index 36d05932..3ce71a6b 100644
--- a/src/generated/zod/gegnachweisgewerbe.ts
+++ b/src/generated/zod/gegnachweisgewerbe.ts
@@ -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(),
diff --git a/src/generated/zod/gegnachweiswohnen.ts b/src/generated/zod/gegnachweiswohnen.ts
index 3d454c3e..9517fb13 100644
--- a/src/generated/zod/gegnachweiswohnen.ts
+++ b/src/generated/zod/gegnachweiswohnen.ts
@@ -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(),
diff --git a/src/generated/zod/verbrauchsausweisgewerbe.ts b/src/generated/zod/verbrauchsausweisgewerbe.ts
index a7c16a0d..63fe2d8b 100644
--- a/src/generated/zod/verbrauchsausweisgewerbe.ts
+++ b/src/generated/zod/verbrauchsausweisgewerbe.ts
@@ -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(),
diff --git a/src/generated/zod/verbrauchsausweiswohnen.ts b/src/generated/zod/verbrauchsausweiswohnen.ts
index 34b9c4af..3425b342 100644
--- a/src/generated/zod/verbrauchsausweiswohnen.ts
+++ b/src/generated/zod/verbrauchsausweiswohnen.ts
@@ -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(),
diff --git a/src/layouts/DashboardLayout.astro b/src/layouts/DashboardLayout.astro
index d3726c72..5a4ccece 100644
--- a/src/layouts/DashboardLayout.astro
+++ b/src/layouts/DashboardLayout.astro
@@ -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,
+ },
+ });
}
-
-
+
-
+
-
-
-
-
-
-
-
+
+
+
-
-
\ No newline at end of file
+
diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts
index 83d00205..dde2ebb5 100644
--- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts
+++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts
@@ -2,7 +2,8 @@ import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#c
import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js";
import moment from "moment";
-import bauwerkskatalog from "./bauwerkskatalog.json" assert { type: "json" }
+import bauwerkskatalog from "./bauwerkskatalog.json" with { type: "json" }
+import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js";
function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient) {
let tekWerte = new Array(8).fill(0);
@@ -59,42 +60,12 @@ function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient
* @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll
* @return VerbrauchsausweisGewerbeCalculationResult
*/
-export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) {
- if (!aufnahme || !objekt || !ausweis) {
+export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, klimafaktoren: { month: number, year: number, klimafaktor: number }[]) {
+ if (!aufnahme || !objekt || !ausweis || !klimafaktoren) {
return null;
}
const nutzflaeche = aufnahme.nutzflaeche || 0;
-
- let startdatum = moment(ausweis.startdatum);
-
- let klimafaktoren: Awaited> = [{
- month: startdatum.month(),
- year: startdatum.year(),
- klimafaktor: 1
- },
- {
- month: startdatum.month(),
- year: startdatum.year() + 1,
- klimafaktor: 1
- },
- {
- month: startdatum.month(),
- year: startdatum.year() + 2,
- klimafaktor: 1
- }];
-
- try {
- const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz)
-
- if (response) {
- klimafaktoren = response
- }
- } catch (e) {
- // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück.
- // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung.
- // return null
- }
// Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts
new file mode 100644
index 00000000..0c8842b5
--- /dev/null
+++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts
@@ -0,0 +1,39 @@
+import moment from "moment";
+import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "./VerbrauchsausweisGewerbe_2016.js";
+import { Aufnahme, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma.js";
+import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
+
+export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(
+ ausweis: VerbrauchsausweisGewerbe,
+ aufnahme: Aufnahme,
+ objekt: Objekt,
+) {
+ const startdatum = moment(ausweis.startdatum);
+ let klimafaktoren = await getKlimafaktoren(
+ objekt.plz as string,
+ startdatum.toDate(),
+ startdatum.add(2, "years").toDate()
+ );
+
+ if (!klimafaktoren || klimafaktoren.length === 0) {
+ klimafaktoren = [
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year"),
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 1,
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 2,
+ },
+ ];
+ }
+
+ return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren)
+}
diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts
new file mode 100644
index 00000000..41032d89
--- /dev/null
+++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts
@@ -0,0 +1,39 @@
+import moment from "moment";
+import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js";
+import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "./VerbrauchsausweisGewerbe_2016.js";
+import { Aufnahme, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma.js";
+
+export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(
+ ausweis: VerbrauchsausweisGewerbe,
+ aufnahme: Aufnahme,
+ objekt: Objekt,
+) {
+ const startdatum = moment(ausweis.startdatum);
+ let klimafaktoren = await getKlimafaktorenServer(
+ objekt.plz as string,
+ startdatum.toDate(),
+ startdatum.add(2, "years").toDate()
+ );
+
+ if (klimafaktoren.length === 0) {
+ klimafaktoren = [
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year"),
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 1,
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 2,
+ },
+ ];
+ }
+
+ return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren)
+}
diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts
index 78f543db..60ed6296 100644
--- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts
+++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts
@@ -1,8 +1,6 @@
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
-import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js";
import { Enums } from "#lib/client/prisma.js";
-import moment from "moment";
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
ausweis: VerbrauchsausweisWohnenClient,
@@ -24,43 +22,13 @@ export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
export async function endEnergieVerbrauchVerbrauchsausweis_2016(
ausweis: VerbrauchsausweisWohnenClient,
aufnahme: AufnahmeClient,
- objekt: ObjektClient
+ objekt: ObjektClient,
+ klimafaktoren: {month: number, year: number, klimafaktor: number}[]
) {
- if (!aufnahme || !objekt || !ausweis) {
+ if (!aufnahme || !objekt || !ausweis || !klimafaktoren) {
return null;
}
- let startdatum = moment(ausweis.startdatum);
-
- let klimafaktoren: Awaited> = [{
- month: startdatum.month(),
- year: startdatum.year(),
- klimafaktor: 1
- },
- {
- month: startdatum.month(),
- year: startdatum.year() + 1,
- klimafaktor: 1
- },
- {
- month: startdatum.month(),
- year: startdatum.year() + 2,
- klimafaktor: 1
- }];
-
- try {
- const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz)
-
- if (response) {
- klimafaktoren = response
- }
- } catch (e) {
- // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück.
- // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung.
- // return null
- }
-
-
// Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = getHeizwertfaktor(
diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts
new file mode 100644
index 00000000..7bee248d
--- /dev/null
+++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts
@@ -0,0 +1,43 @@
+import {
+ VerbrauchsausweisWohnenClient,
+ AufnahmeClient,
+ ObjektClient,
+} from "#components/Ausweis/types.js";
+import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
+import moment from "moment";
+import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen_2016.js";
+
+export async function endEnergieVerbrauchVerbrauchsausweis_2016_Client(
+ ausweis: VerbrauchsausweisWohnenClient,
+ aufnahme: AufnahmeClient,
+ objekt: ObjektClient,
+) {
+ const startdatum = moment(ausweis.startdatum);
+ let klimafaktoren = await getKlimafaktoren(
+ objekt.plz as string,
+ startdatum.toDate(),
+ startdatum.add(2, "years").toDate()
+ );
+
+ if (!klimafaktoren || klimafaktoren.length === 0) {
+ klimafaktoren = [
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year"),
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 1,
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 2,
+ },
+ ];
+ }
+
+ return await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt, klimafaktoren)
+}
diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts
new file mode 100644
index 00000000..283249d1
--- /dev/null
+++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts
@@ -0,0 +1,48 @@
+import {
+ VerbrauchsausweisWohnenClient,
+ AufnahmeClient,
+ ObjektClient,
+} from "#components/Ausweis/types.js";
+import moment from "moment";
+import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen_2016.js";
+import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js";
+
+export async function endEnergieVerbrauchVerbrauchsausweis_2016_Server(
+ ausweis: VerbrauchsausweisWohnenClient,
+ aufnahme: AufnahmeClient,
+ objekt: ObjektClient
+) {
+ const startdatum = moment(ausweis.startdatum);
+ let klimafaktoren = await getKlimafaktorenServer(
+ objekt.plz as string,
+ startdatum.toDate(),
+ startdatum.add(2, "years").toDate()
+ );
+
+ if (klimafaktoren.length === 0) {
+ klimafaktoren = [
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year"),
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 1,
+ },
+ {
+ klimafaktor: 1,
+ month: startdatum.get("m"),
+ year: startdatum.get("year") + 2,
+ },
+ ];
+ }
+
+ return await endEnergieVerbrauchVerbrauchsausweis_2016(
+ ausweis,
+ aufnahme,
+ objekt,
+ klimafaktoren
+ );
+}
diff --git a/src/lib/Berechnungen/endEnergieVerbrauch.ts b/src/lib/Berechnungen/endEnergieVerbrauch.ts
deleted file mode 100644
index 4edb4de2..00000000
--- a/src/lib/Berechnungen/endEnergieVerbrauch.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import type { VerbrauchsausweisWohnen } from "#lib/client/prisma";
-import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
-import { AufnahmeClient, ObjektClient } from "#components/Ausweis/types.js";
-
-export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen, aufnahme: AufnahmeClient, objekt: ObjektClient): Promise {
- const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
-
- if (!result) {
- return 0;
- }
-
- return result.endEnergieVerbrauchGesamt;
-}
\ No newline at end of file
diff --git a/src/lib/Klimafaktoren.ts b/src/lib/Klimafaktoren.ts
index 5326b948..9dbed741 100644
--- a/src/lib/Klimafaktoren.ts
+++ b/src/lib/Klimafaktoren.ts
@@ -18,8 +18,6 @@ export const getKlimafaktoren = memoize(async (date: Date, plz: string) => {
});
return response;
} catch (e) {
- console.log(e);
-
return null;
}
});
diff --git a/src/lib/constants.ts b/src/lib/constants.ts
index 48b23008..271410da 100644
--- a/src/lib/constants.ts
+++ b/src/lib/constants.ts
@@ -112,4 +112,4 @@ export const SERVICES: Record<
};
export const BASE_URI = process.env.NODE_ENV == "production" ? "https://online-energieausweis.org" : "http://localhost:3000";
-export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "znjmkmbA3Hbx9dC7wdKp7TnOf1pcRl_tCUwEBZys7bj-QRPG"
\ No newline at end of file
+export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q"
\ No newline at end of file
diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts
index 6a9d4c56..05811876 100644
--- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts
+++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts
@@ -4,8 +4,8 @@ import { PDFDocument, StandardFonts } from "pdf-lib";
import { xml2pdf } from "./elements/xml2pdf.js";
import moment from "moment";
import { Enums, Heizungsstatus } from "#lib/server/prisma.js";
-import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { copyPage } from "./utils/copyPage.js";
+import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js";
/* -------------------------------- Pdf Tools ------------------------------- */
@@ -18,7 +18,7 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa
// const template = VerbrauchsausweisWohnen2016Template as Template;
- const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
+ const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(ausweis, aufnahme, objekt);
const height = pages[0].getHeight()
const width = pages[0].getWidth()
diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts
index 54f69d4b..4c7d1ab1 100644
--- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts
+++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts
@@ -6,6 +6,7 @@ import { xml2pdf } from "./elements/xml2pdf.js";
import moment from "moment";
import { Enums, Heizungsstatus } from "#lib/server/prisma.js";
import { copyPage } from "./utils/copyPage.js";
+import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js";
/* -------------------------------- Pdf Tools ------------------------------- */
@@ -19,7 +20,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
// const template = VerbrauchsausweisWohnen2016Template as Template;
- const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
+ const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016_Server(ausweis, aufnahme, objekt);
const height = pages[0].getHeight()
const width = pages[0].getWidth()
@@ -332,8 +333,5 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
await layoutPage2.draw(pages[1], 0, pages[1].getHeight())
await layoutPage3.draw(pages[2], 0, pages[2].getHeight())
- console.log("DONE");
-
-
return pdf.save();
}
\ No newline at end of file
diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts
index f0f9862e..83632657 100644
--- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts
+++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts
@@ -1,5 +1,4 @@
import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
-import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs"
@@ -7,18 +6,19 @@ import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addCheckMark } from "./utils/checkbox.js";
import { addText } from "./utils/text.js";
-import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js";
+import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
import { getS3File } from "#lib/s3.js";
+import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js";
-export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient) {
+export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) {
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const pages = pdf.getPages()
// const template = VerbrauchsausweisWohnen2016Template as Template;
- const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
+ const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(ausweis, aufnahme, objekt);
const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt)
@@ -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)
}
@@ -184,7 +184,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
})
// Stempel und Unterschrift
- if (ausweis.ausgestellt) {
+ if (ausweis.ausgestellt || !vorschau) {
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
const stempelHeight = 60
@@ -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) {
@@ -612,10 +687,16 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
}
- for (const page of pages) {
- addAnsichtsausweisLabel(page, font)
- addDatumGEG(page, font)
- }
+ for (let i = 0; i < pages.length; i++) {
+ const page = pages[i];
+ if (vorschau) {
+ addAnsichtsausweisLabel(page, font)
+ }
+ addDatumGEG(page, font)
+ if (i !== pages.length - 1) {
+ addRegistriernummer(page, font, ausweis.registriernummer || "")
+ }
+ }
diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts
index e2b2ce5c..a5f3c72f 100644
--- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts
+++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts
@@ -1,5 +1,4 @@
import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
-import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs"
@@ -7,19 +6,21 @@ import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addCheckMark } from "./utils/checkbox.js";
import { addText } from "./utils/text.js";
-import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js";
+import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
import { getS3File } from "#lib/s3.js";
+import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js";
/* -------------------------------- Pdf Tools ------------------------------- */
-export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient) {
+export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) {
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Wohngebaeude_ohne_pfeile.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const pages = pdf.getPages()
// const template = VerbrauchsausweisWohnen2016Template as Template;
- const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
+ const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016_Server(ausweis, aufnahme, objekt);
+
const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt)
const height = pages[0].getHeight()
@@ -27,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
@@ -195,7 +196,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
})
// Stempel und Unterschrift
- if (ausweis.ausgestellt) {
+ if (!vorschau) {
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
const stempelHeight = 60
@@ -209,6 +210,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
// Aussteller
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
+
pages[0].drawImage(aussteller, {
x: 40,
y: height - 770,
@@ -591,9 +593,15 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
}
- for (const page of pages) {
- addAnsichtsausweisLabel(page, font)
+ for (let i = 0; i < pages.length; i++) {
+ const page = pages[i];
+ if (vorschau) {
+ addAnsichtsausweisLabel(page, font)
+ }
addDatumGEG(page, font)
+ if (i !== pages.length - 1) {
+ addRegistriernummer(page, font, ausweis.registriernummer || "")
+ }
}
return pdf.save();
diff --git a/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf b/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf
index c5734609..476ccc13 100644
Binary files a/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf and b/src/lib/pdf/templates/GEG24_Nichtwohngebaeude.pdf differ
diff --git a/src/lib/pdf/utils/helpers.ts b/src/lib/pdf/utils/helpers.ts
index dd9d3655..07a7bd5b 100644
--- a/src/lib/pdf/utils/helpers.ts
+++ b/src/lib/pdf/utils/helpers.ts
@@ -22,3 +22,13 @@ export function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) {
opacity: 0.3,
});
}
+
+
+export function addRegistriernummer(page: PDFPage, font: PDFFont, registriernummer: string) {
+ page.drawText(registriernummer, {
+ x: 435,
+ y: page.getHeight() - 113,
+ size: 10,
+ font,
+ });
+}
\ No newline at end of file
diff --git a/src/lib/server/ausweis.ts b/src/lib/server/ausweis.ts
index 3e37c7c7..d92a1896 100644
--- a/src/lib/server/ausweis.ts
+++ b/src/lib/server/ausweis.ts
@@ -31,15 +31,15 @@ export function getPrismaAusweisAdapter(id: string) {
* Gibt den richtigen Ansichtsausweis basierend auf der Ausweisart zurück.
* @param ausweis
*/
-export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromId(ausweis.id)) {
+export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau: boolean = true, ausweisart = getAusweisartFromId(ausweis.id)) {
if (!ausweisart) {
return null
}
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
- return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user)
+ return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user, vorschau)
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
- return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user)
+ return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, vorschau)
}
return null
diff --git a/src/lib/server/db.ts b/src/lib/server/db.ts
index bf628b9d..8f7554c3 100644
--- a/src/lib/server/db.ts
+++ b/src/lib/server/db.ts
@@ -8,6 +8,28 @@ export async function getVerbrauchsausweisWohnen(id: string): Promise>;
+
export async function getVerbrauchsausweisGewerbe(id: string): Promise {
return await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
@@ -16,6 +38,26 @@ export async function getVerbrauchsausweisGewerbe(id: string): Promise {
return await prisma.bedarfsausweisWohnen.findUnique({
where: {
@@ -24,6 +66,26 @@ export async function getBedarfsausweisWohnen(id: string): Promise {
return await prisma.bedarfsausweisGewerbe.findUnique({
where: {
diff --git a/src/lib/server/invoice.ts b/src/lib/server/invoice.ts
new file mode 100644
index 00000000..ae5cc794
--- /dev/null
+++ b/src/lib/server/invoice.ts
@@ -0,0 +1,330 @@
+import { getAusweisartFromId } from "#components/Ausweis/types.js";
+import moment from "moment";
+import { createLexOfficeCustomer } from "./lexoffice.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 LineItem = ReturnType;
+
+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.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)
+ );
+ }
+
+ return data;
+}
+
+/**
+ * Erstellt eine Rechnung in LexOffice und gibt die ID zurück.
+ * Die Preise basieren auf den in der Konstante `__PRICES__` definierten Preisen.
+ * @param Ausweis ausweis
+ * @param Rechnung $rechnung
+ * @return array
+ * @throws Error
+ */
+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");
+ }
+
+ const user = await prisma.benutzer.findUnique({
+ where: {
+ id: ausweis.benutzer_id,
+ },
+ });
+
+ if (!user) {
+ throw new Error("Nutzer existiert nicht!");
+ } else if (user.lex_office_id == null) {
+ // User has no valid lex_id
+ const lex_office_id = await createLexOfficeCustomer(user);
+
+ user.lex_office_id = lex_office_id;
+
+ await prisma.benutzer.update({
+ where: {
+ id: user.id,
+ },
+ data: {
+ lex_office_id: user.lex_office_id,
+ },
+ });
+ }
+
+ const ausweisart = getAusweisartFromId(ausweis.id);
+
+ let data = {
+ voucherDate: moment().format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
+ taxConditions: {
+ taxType: "gross",
+ },
+ 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,
+ },
+ 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.",
+ };
+
+ if (rechnung.status == Enums.Rechnungsstatus.paid) {
+ const types: Record = {
+ [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.`;
+ }
+
+ const tax_rate = 19;
+
+ if (rechnung.betrag == 15) {
+ // Korrektur alleinstehend
+ 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)
+ );
+ } else if (rechnung.betrag > 400 && rechnung.betrag != 476) {
+ 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
+ )
+ );
+ } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
+ 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
+ )
+ );
+ }
+ } 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
+ )
+ );
+ } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
+ 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
+ )
+ );
+ }
+ } 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
+ )
+ );
+ } 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
+ )
+ );
+ } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
+ 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),
+ }
+ );
+
+ if (response.status == 400) {
+ throw new Error("Fehler beim Absenden der Request.");
+ }
+
+ 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 abfrage_response = await request.json();
+
+ return {
+ id: invoice["id"],
+ voucherNumber: abfrage_response["voucherNumber"],
+ };
+}
+
+
+
+/**
+ * Ládt das Reechnungs PDF von LexOffice runter.
+ *
+ * @export
+ * @async
+ * @param {Rechnung} rechnung
+ * @returns {ArrayBuffer}
+ * @throws Falls eine der requests fehlschlägt.
+ */
+export async function getLexOfficeRechnung(rechnung: Rechnung) {
+
+ const response = await fetch(`https://api.lexoffice.io/v1/invoices/${rechnung.lex_office_id}/document`, {
+ method: "GET",
+ headers: {
+ "Accept": `application/json`,
+ "Authorization": `Bearer ${LEX_OFFICE_API_KEY}`,
+ "Content-Type": `application/json`
+ }
+ })
+
+ const body = await response.json()
+
+ if(!("documentFileId" in body)){
+ throw new Error("documentFileId nicht in request.")
+ }
+
+ const file_id = body["documentFileId"];
+
+
+ const fileRequest = await fetch(`https://api.lexoffice.io/v1/files/${file_id}`, {
+ method: "GET",
+ headers: {
+ "Accept": `application/pdf`,
+ "Authorization": `Bearer ${LEX_OFFICE_API_KEY}`,
+ }
+ })
+
+ if (fileRequest.status !== 200) {
+ throw new Error("File request hat nicht funktioniert.")
+ }
+
+ const file = await fileRequest.arrayBuffer()
+
+ return file;
+}
\ No newline at end of file
diff --git a/src/lib/server/klimafaktoren.ts b/src/lib/server/klimafaktoren.ts
new file mode 100644
index 00000000..6c33dc97
--- /dev/null
+++ b/src/lib/server/klimafaktoren.ts
@@ -0,0 +1,47 @@
+import moment from "moment";
+import { prisma } from "./prisma.js";
+
+export async function getKlimafaktorenServer(plz: string, startdatum: Date, enddatum: Date) {
+ const start = moment(startdatum);
+ const end = moment(enddatum);
+
+ if (start.isSameOrAfter(end)) {
+ return []
+ }
+
+ const intervals = [];
+
+ let currentDate = start.clone();
+ while (currentDate.isSameOrBefore(end)) {
+ let copy = currentDate.clone();
+ intervals.push(copy);
+ currentDate.add(1, "year");
+ }
+
+ let klimafaktoren = await prisma.klimafaktoren.findMany({
+ where: {
+ plz,
+ month: intervals[0].month(),
+ OR: intervals.map((date) => {
+ return {
+ year: date.year(),
+ };
+ }),
+ },
+ });
+
+ if (!klimafaktoren) {
+ return []
+ }
+
+ // NOTE: Sollten wir hier lieber den Output padden und trotzdem die gefundenen zurückgeben?
+ if (klimafaktoren.length !== intervals.length) {
+ return []
+ }
+
+ return klimafaktoren.map((klimafaktor) => ({
+ month: klimafaktor.month,
+ year: klimafaktor.year,
+ klimafaktor: klimafaktor.klimafaktor,
+ }));
+}
diff --git a/src/lib/server/lexoffice.ts b/src/lib/server/lexoffice.ts
index df52a8e9..e2bf82b7 100644
--- a/src/lib/server/lexoffice.ts
+++ b/src/lib/server/lexoffice.ts
@@ -1,10 +1,10 @@
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { LEX_OFFICE_API_KEY } from "#lib/constants.js";
-import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma";
-import { prisma } from "#lib/server/prisma";
+import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
+import { prisma } from "#lib/server/prisma.js";
import moment from "moment";
-export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: {
+export async function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: {
bezeichnung: string,
positionstext: string,
preis: number,
@@ -103,149 +103,149 @@ export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | Bedarf
throw new Error(`Ein Fehler ist aufgetreten: ${pdfResult.message}`);
}
- $pdf_id = $render_response["documentFileId"];
+ // $pdf_id = $render_response["documentFileId"];
- db()->execute("UPDATE Angebotsanfragen SET
- Adresse_Objekt = :Adresse_Objekt,
- PLZ_Objekt = :PLZ_Objekt,
- Ort_Objekt = :Ort_Objekt,
- Dienstleistung = :Dienstleistung,
- Empfaengerrechnung = :Empfaengerrechnung,
- Zusatzzeilerechnung = :Zusatzzeilerechnung,
- Adresse = :Adresse,
- PLZ = :PLZ,
- Ort = :Ort,
- Anlass = :Anlass,
- Baujahrheizung = :Baujahrheizung,
- Baujahrgebaeude = :Baujahrgebaeude,
- Baujahrklima = :Baujahrklima,
- Gebaeudetyp = :Gebaeudetyp,
- Nutzflaeche = :Nutzflaeche,
- Sanierungsstatus = :Sanierungsstatus,
- Nachricht = :Nachricht,
- Datei = :Datei,
- Rolle = :Rolle,
- Email = :Email,
- Angebotspreis = :Angebotspreis,
- Rabatt = :Rabatt,
- `Status` = 'Verschickt',
- lex_office_id = :lex_office_id,
- Textanschreiben = :Textanschreiben,
- Positionstext = :Positionstext
- WHERE Auftragsnummer = :Auftragsnummer", [
- "Adresse_Objekt": $_POST["gebaeude_strasse"],
- "PLZ_Objekt": $_POST["gebaeude_plz"],
- "Ort_Objekt": $_POST["gebaeude_ort"],
- "Dienstleistung": $_POST["dienstleistung"],
- "Empfaengerrechnung": $_POST["rechnung_empfaenger"],
- "Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"],
- "Adresse": $_POST["rechnung_strasse"],
- "PLZ": $_POST["rechnung_plz"],
- "Ort": $_POST["rechnung_ort"],
- "Anlass": $_POST["anlass"],
- "Baujahrheizung": $_POST["baujahr_heizung"],
- "Baujahrgebaeude": $_POST["baujahr_gebaeude"],
- "Baujahrklima": $_POST["baujahr_klimaanlage"],
- "Gebaeudetyp": $_POST["gebaeudetyp"],
- "Nutzflaeche": $_POST["nutzflaeche"],
- "Sanierungsstatus": $_POST["sanierungsstatus"],
- "Nachricht": $_POST["nachricht"],
- "Datei": $dateien,
- "Rolle": $_POST["rolle"],
- "Email": $_POST["email"],
- "Angebotspreis": $_POST["Angebotspreis"],
- "Rabatt": $_POST["Rabatt"],
- "lex_office_id": $lex_office_id,
- "Textanschreiben": $_POST["Textanschreiben"],
- "Positionstext": $_POST["Positionstext"],
- "Auftragsnummer": $_POST["Auftragsnummer"]
- ]);
+ // db()->execute("UPDATE Angebotsanfragen SET
+ // Adresse_Objekt = :Adresse_Objekt,
+ // PLZ_Objekt = :PLZ_Objekt,
+ // Ort_Objekt = :Ort_Objekt,
+ // Dienstleistung = :Dienstleistung,
+ // Empfaengerrechnung = :Empfaengerrechnung,
+ // Zusatzzeilerechnung = :Zusatzzeilerechnung,
+ // Adresse = :Adresse,
+ // PLZ = :PLZ,
+ // Ort = :Ort,
+ // Anlass = :Anlass,
+ // Baujahrheizung = :Baujahrheizung,
+ // Baujahrgebaeude = :Baujahrgebaeude,
+ // Baujahrklima = :Baujahrklima,
+ // Gebaeudetyp = :Gebaeudetyp,
+ // Nutzflaeche = :Nutzflaeche,
+ // Sanierungsstatus = :Sanierungsstatus,
+ // Nachricht = :Nachricht,
+ // Datei = :Datei,
+ // Rolle = :Rolle,
+ // Email = :Email,
+ // Angebotspreis = :Angebotspreis,
+ // Rabatt = :Rabatt,
+ // `Status` = 'Verschickt',
+ // lex_office_id = :lex_office_id,
+ // Textanschreiben = :Textanschreiben,
+ // Positionstext = :Positionstext
+ // WHERE Auftragsnummer = :Auftragsnummer", [
+ // "Adresse_Objekt": $_POST["gebaeude_strasse"],
+ // "PLZ_Objekt": $_POST["gebaeude_plz"],
+ // "Ort_Objekt": $_POST["gebaeude_ort"],
+ // "Dienstleistung": $_POST["dienstleistung"],
+ // "Empfaengerrechnung": $_POST["rechnung_empfaenger"],
+ // "Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"],
+ // "Adresse": $_POST["rechnung_strasse"],
+ // "PLZ": $_POST["rechnung_plz"],
+ // "Ort": $_POST["rechnung_ort"],
+ // "Anlass": $_POST["anlass"],
+ // "Baujahrheizung": $_POST["baujahr_heizung"],
+ // "Baujahrgebaeude": $_POST["baujahr_gebaeude"],
+ // "Baujahrklima": $_POST["baujahr_klimaanlage"],
+ // "Gebaeudetyp": $_POST["gebaeudetyp"],
+ // "Nutzflaeche": $_POST["nutzflaeche"],
+ // "Sanierungsstatus": $_POST["sanierungsstatus"],
+ // "Nachricht": $_POST["nachricht"],
+ // "Datei": $dateien,
+ // "Rolle": $_POST["rolle"],
+ // "Email": $_POST["email"],
+ // "Angebotspreis": $_POST["Angebotspreis"],
+ // "Rabatt": $_POST["Rabatt"],
+ // "lex_office_id": $lex_office_id,
+ // "Textanschreiben": $_POST["Textanschreiben"],
+ // "Positionstext": $_POST["Positionstext"],
+ // "Auftragsnummer": $_POST["Auftragsnummer"]
+ // ]);
- // Die Auftragsnummer abfragen
+ // // Die Auftragsnummer abfragen
- $curl_nummer = curl_init();
+ // $curl_nummer = curl_init();
- curl_setopt_array($curl_nummer, [
- CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id",
- CURLOPT_RETURNTRANSFER: true,
- CURLOPT_ENCODING: "",
- CURLOPT_MAXREDIRS: 10,
- CURLOPT_TIMEOUT: 30,
- CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
- CURLOPT_CUSTOMREQUEST: "GET",
- CURLOPT_HTTPHEADER: [
- "Accept: application/json",
- "Authorization: Bearer " . LEX_OFFICE_API_KEY
- ]
- ]);
+ // curl_setopt_array($curl_nummer, [
+ // CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id",
+ // CURLOPT_RETURNTRANSFER: true,
+ // CURLOPT_ENCODING: "",
+ // CURLOPT_MAXREDIRS: 10,
+ // CURLOPT_TIMEOUT: 30,
+ // CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
+ // CURLOPT_CUSTOMREQUEST: "GET",
+ // CURLOPT_HTTPHEADER: [
+ // "Accept: application/json",
+ // "Authorization: Bearer " . LEX_OFFICE_API_KEY
+ // ]
+ // ]);
- $nummer_response = curl_exec($curl_nummer);
- $nummer_response = json_decode($nummer_response, true);
- $err = curl_error($curl_nummer);
+ // $nummer_response = curl_exec($curl_nummer);
+ // $nummer_response = json_decode($nummer_response, true);
+ // $err = curl_error($curl_nummer);
- curl_close($curl_nummer);
+ // curl_close($curl_nummer);
- // Und die Mail verschicken
+ // // Und die Mail verschicken
- $mail = new PHPMailer\PHPMailer\PHPMailer(true);
+ // $mail = new PHPMailer\PHPMailer\PHPMailer(true);
- $mail->IsSMTP();
- $mail->Host = "smtp.ionos.de";
- $mail->SMTPAuth = true;
- $mail->Username = 'info@online-energieausweis.org';
- $mail->Password = 'Katendeich5a2024!';
+ // $mail->IsSMTP();
+ // $mail->Host = "smtp.ionos.de";
+ // $mail->SMTPAuth = true;
+ // $mail->Username = 'info@online-energieausweis.org';
+ // $mail->Password = 'Katendeich5a2024!';
- $mail->CharSet = 'UTF-8';
- $mail->Encoding = 'base64';
- $mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0);
- $mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]);
- $mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen");
- $mail->isHTML(true);
- $mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}";
+ // $mail->CharSet = 'UTF-8';
+ // $mail->Encoding = 'base64';
+ // $mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0);
+ // $mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]);
+ // $mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen");
+ // $mail->isHTML(true);
+ // $mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}";
- // carriage return type (RFC)
- $eol = " ";
- $anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"];
+ // // carriage return type (RFC)
+ // $eol = " ";
+ // $anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"];
- $message = "$anrede {$_POST["name"]},{$eol}{$eol}";
- $message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}";
- $message .= "Mit freundlichen Grüßen,$eol";
- $message .= "Jens Cornelsen$eol";
- $message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon 040 209339858{$eol}Fax 040 209339859";
- $mail->Body = $message;
+ // $message = "$anrede {$_POST["name"]},{$eol}{$eol}";
+ // $message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}";
+ // $message .= "Mit freundlichen Grüßen,$eol";
+ // $message .= "Jens Cornelsen$eol";
+ // $message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon 040 209339858{$eol}Fax 040 209339859";
+ // $mail->Body = $message;
- $curl_pdf = curl_init();
+ // $curl_pdf = curl_init();
- curl_setopt_array($curl_pdf, [
- CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id",
- CURLOPT_RETURNTRANSFER: true,
- CURLOPT_ENCODING: "",
- CURLOPT_MAXREDIRS: 10,
- CURLOPT_TIMEOUT: 30,
- CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
- CURLOPT_CUSTOMREQUEST: "GET",
- CURLOPT_HTTPHEADER: [
- "Accept: application/pdf",
- "Authorization: Bearer " . LEX_OFFICE_API_KEY
- ]
- ]);
+ // curl_setopt_array($curl_pdf, [
+ // CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id",
+ // CURLOPT_RETURNTRANSFER: true,
+ // CURLOPT_ENCODING: "",
+ // CURLOPT_MAXREDIRS: 10,
+ // CURLOPT_TIMEOUT: 30,
+ // CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
+ // CURLOPT_CUSTOMREQUEST: "GET",
+ // CURLOPT_HTTPHEADER: [
+ // "Accept: application/pdf",
+ // "Authorization: Bearer " . LEX_OFFICE_API_KEY
+ // ]
+ // ]);
- $response = curl_exec($curl_pdf);
- $err = curl_error($curl_pdf);
+ // $response = curl_exec($curl_pdf);
+ // $err = curl_error($curl_pdf);
- $HOME = dirname($ROOT);
+ // $HOME = dirname($ROOT);
- curl_close($curl_pdf);
- $fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+");
- fwrite($fp, $response);
- fclose($fp);
+ // curl_close($curl_pdf);
+ // $fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+");
+ // fwrite($fp, $response);
+ // fclose($fp);
- $mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf");
+ // $mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf");
- $mail->send();
+ // $mail->send();
- echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen.";
+ // echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen.";
}
export async function createLexOfficeCustomer(user: Benutzer) {
diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte
index 2a1202fd..1c1a25e4 100644
--- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte
+++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte
@@ -36,6 +36,8 @@
export let unterlagen: Unterlage[] = [];
export let id: string | null;
+ export let partner_code: string;
+
export let loadFromDatabase: boolean = false;
// Wir holen die daten aus dem LocalStorage falls
@@ -143,6 +145,7 @@
bind:unterlagen
bind:blockLocalStorageSync
{ausweisart}
+ {partner_code}
showWeiter={false}
{form}
{skala}
@@ -277,6 +280,7 @@
bind:unterlagen
bind:blockLocalStorageSync
{ausweisart}
+ {partner_code}
showWeiter={true}
{form}
{skala}
diff --git a/src/modules/Dashboard/DashboardAufnahmeModule.svelte b/src/modules/Dashboard/DashboardAufnahmeModule.svelte
index fcc60428..2b6e7d17 100644
--- a/src/modules/Dashboard/DashboardAufnahmeModule.svelte
+++ b/src/modules/Dashboard/DashboardAufnahmeModule.svelte
@@ -4,7 +4,7 @@
import Carousel from "#components/Carousel.svelte";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte";
- import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
+ import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
import { Objekt } from "#lib/client/prisma.js";
import mime from "mime"
import { ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
@@ -96,5 +96,5 @@
-
+
\ No newline at end of file
diff --git a/src/modules/Dashboard/DashboardAusweiseModule.svelte b/src/modules/Dashboard/DashboardAusweiseModule.svelte
deleted file mode 100644
index cb4070f5..00000000
--- a/src/modules/Dashboard/DashboardAusweiseModule.svelte
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-{#if errorCount > 0}
-Wichtiges
-
-
- {#each ausweisUeberpruefung as { errors }}
- {#if errors.length > 0}
-
-
-
{errors[0].severity == "error" ? "Achtung!" : "Wichtig!"}
-
{errors[0].title}
-
{errors[0].description}
- {#if errors[0].resolvehref}
-
- {/if}
-
-
- {/if}
- {/each}
-
-{/if}
-
-Ihre Ausweise
-
-
-
- {#if ausweise === null}
-
- {:else}
- {#if ausweise.length == 0}
-
-
Es konnten keine Ausweise gefunden werden.
-
Erstellen sie einen Verbrauchsausweis für ihr Wohngebäude hier
-
- {:else}
- {#each ausweise as ausweis, i}
-
- {/each}
- {/if}
- {/if}
-
-
-
-
\ No newline at end of file
diff --git a/src/modules/Dashboard/DashboardModule.svelte b/src/modules/Dashboard/DashboardModule.svelte
index 9cd5f3a4..0ac7dc41 100644
--- a/src/modules/Dashboard/DashboardModule.svelte
+++ b/src/modules/Dashboard/DashboardModule.svelte
@@ -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 = {
+ let objekt: Objekt = {
adresse: "",
erstellungsdatum: new Date(),
latitude: 0,
@@ -91,8 +87,6 @@
objekte = objekte
}
- let filters: { name: keyof z.infer, type: ZodTypeAny, value: any }[] = []
-
export let id: string = "";
diff --git a/src/modules/ImpersonateUserModule.svelte b/src/modules/ImpersonateUserModule.svelte
index 8b623303..2175c94c 100644
--- a/src/modules/ImpersonateUserModule.svelte
+++ b/src/modules/ImpersonateUserModule.svelte
@@ -27,7 +27,7 @@
{user.vorname} {user.name}
{user.email}
- Einloggen
+ Einloggen
{/each}
diff --git a/src/modules/KundendatenModule.svelte b/src/modules/KundendatenModule.svelte
index 30e3e76a..dcd27407 100644
--- a/src/modules/KundendatenModule.svelte
+++ b/src/modules/KundendatenModule.svelte
@@ -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;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
@@ -211,7 +213,7 @@
versand_plz: versand_plz,
versand_ort: versand_ort,
telefon: telefon,
- nachweis_id: result.nachweis_id,
+ nachweis_id: result.nachweis_id
},
{
headers: {
@@ -291,7 +293,7 @@
let result: Awaited> | Awaited> | null = null;
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
- result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart)
+ result = await nachweisSpeichern(ausweis as unknown as GEGNachweisWohnen, objekt, aufnahme, bilder, unterlagen, ausweisart)
} else {
result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart)
}
@@ -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"
Bitte untenstehende Punkte bestätigen. Bitte gehen Sie gegebenenfalls zurück zum Formular und überprüfen bzw. korrigieren Ihre Eingaben.
{#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}
diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte
index e4ea4a8b..22bfb6de 100644
--- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte
+++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte
@@ -49,6 +49,7 @@
export let bilder: BildClient[];
export let id: string | null;
+ export let partner_code: string;
export let loadFromDatabase: boolean = false;
const ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe
@@ -128,6 +129,7 @@
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={false}
{form}
+ {partner_code}
{skala}
>
@@ -244,6 +246,7 @@
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={true}
{form}
+ {partner_code}
{skala}
>
diff --git a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte
index 2e546118..0e2f0f4e 100644
--- a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte
+++ b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte
@@ -160,6 +160,7 @@ let skala: HTMLDivElement;
bind:aufnahme
ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen}
showWeiter={false}
+ {partner_code}
{form}
{skala}
>
diff --git a/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro b/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro
index d4373c1d..929beaf4 100644
--- a/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro
+++ b/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro
@@ -1,84 +1,91 @@
---
-import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
+
+import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte";
-import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
-import { createCaller } from "src/astro-typesafe-api-caller";
-import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
-import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
-import { Enums } from "#lib/server/prisma";
+import { Aufnahme, BedarfsausweisWohnen, Bild, Enums, Objekt } from "#lib/server/prisma";
+import { getAufnahme, getObjekt, getBilder, getBedarfsausweisWohnen } from "#lib/server/db";
+import { getCurrentUser } from "#lib/server/user";
-const id = Astro.url.searchParams.get("uid") || "";
+const id = Astro.url.searchParams.get("id");
const aufnahme_id = Astro.url.searchParams.get("aufnahme")
-const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard;
-let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
-let aufnahme: AufnahmeClient = {} as AufnahmeClient;
-let objekt: ObjektClient = {} as ObjektClient;
-let bilder: BildClient[] = []
+let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
+const partner_code = Astro.params.partner as string;
-const valid = validateAccessTokenServer(Astro);
+let ausweis: BedarfsausweisWohnen = {} as BedarfsausweisWohnen;
+let aufnahme: Aufnahme = {} as Aufnahme;
+let objekt: Objekt = {} as Objekt;
+let bilder: Bild[] = []
-const caller = createCaller(Astro);
+const user = await getCurrentUser(Astro)
if (id) {
- if (!valid) {
+ if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
- try {
- ausweis = await caller["bedarfsausweis-wohnen"]._id.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- id
- }
- });
+ ausweis = await getBedarfsausweisWohnen(id) as BedarfsausweisWohnen
+ ausweistyp = ausweis.ausweistyp;
- aufnahme = await caller.aufnahme._id.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- id: ausweis.aufnahme_id
- }
- })
+ if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
+ // Der Ausweis scheint nicht zu existieren.
+ // Wir leiten auf die generische Ausweisseite ohne ID weiter.
+ return Astro.redirect(
+ "/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
+ );
+ }
- objekt = await caller.objekt._id.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- id: ausweis.objekt_id
- }
- })
+ aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
- bilder = await caller.aufnahme._id.bilder.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- id: ausweis.aufnahme_id
- }
- })
+ if (!aufnahme) {
+ // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
+ return Astro.redirect(
+ "/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
+ );
+ }
- if (!ausweis) {
- // Der Ausweis scheint nicht zu existieren.
- // Wir leiten auf die generische Ausweisseite ohne UID weiter.
- return Astro.redirect(
- "/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
- );
- }
- } catch(e) {
+ objekt = await getObjekt(aufnahme.objekt_id) as Objekt
+
+ if (!objekt) {
+ // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
+ return Astro.redirect(
+ "/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
+ );
+ }
+
+ bilder = await getBilder(aufnahme.id);
+} else if (aufnahme_id) {
+ if (!user) {
+ return Astro.redirect(
+ `/auth/login?redirect=${Astro.url.toString()}`
+ );
+ }
+
+ aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
+
+ if (!aufnahme) {
+ // Die Aufnahme existiert wohl nicht.
+ return Astro.redirect(
+ "/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
+ );
+ }
+
+ objekt = await getObjekt(aufnahme.objekt_id) as Objekt
+
+ if (!objekt) {
+ // Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
);
}
}
+console.log(ausweistyp);
+
+
---
-
-
+
+
\ No newline at end of file
diff --git a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
index 90793f9d..190b9acc 100644
--- a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
+++ b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
@@ -1,79 +1,80 @@
---
-import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
-import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types";
-import { createCaller } from "src/astro-typesafe-api-caller";
-import { inferOutput } from "astro-typesafe-api/client";
-import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
-import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
+import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
+import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types";
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
-import { Enums } from "#lib/server/prisma";
+import { Aufnahme, Enums, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma";
+import { getAufnahme, getObjekt, getBilder, getVerbrauchsausweisGewerbe } from "#lib/server/db";
+import { getCurrentUser } from "#lib/server/user";
-const uid = Astro.url.searchParams.get("uid");
-const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard;
+const id = Astro.url.searchParams.get("id");
+const aufnahme_id = Astro.url.searchParams.get("aufnahme")
+let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
+const partner_code = Astro.params.partner as string;
let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
-let bilder: UploadedGebaeudeBild[] = []
+let bilder: BildClient[] = []
-const valid = validateAccessTokenServer(Astro);
+const user = await getCurrentUser(Astro)
-const caller = createCaller(Astro);
-
-if (uid) {
- if (!valid) {
+if (id) {
+ if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
- try {
- let { uid_aufnahme, uid_objekt, uid_benutzer, ...result } = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid
- }
- });
+ ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe
+ ausweistyp = ausweis.ausweistyp;
- ausweis = result
+ if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
+ // Der Ausweis scheint nicht zu existieren.
+ // Wir leiten auf die generische Ausweisseite ohne ID weiter.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-gewerbe"
+ );
+ }
- aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid: uid_aufnahme
- }
- })
+ aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
- objekt = await caller.objekt._uid.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid: uid_objekt
- }
- })
+ if (!aufnahme) {
+ // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-gewerbe"
+ );
+ }
- bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid: uid_aufnahme
- }
- })
+ objekt = await getObjekt(aufnahme.objekt_id) as Objekt
- if (!ausweis) {
- // Der Ausweis scheint nicht zu existieren.
- // Wir leiten auf die generische Ausweisseite ohne UID weiter.
- return Astro.redirect(
- "/energieausweis-erstellen/verbrauchsausweis-gewerbe"
- );
- }
- } catch(e) {
+ if (!objekt) {
+ // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-gewerbe"
+ );
+ }
+
+ bilder = await getBilder(aufnahme.id);
+} else if (aufnahme_id) {
+ if (!user) {
+ return Astro.redirect(
+ `/auth/login?redirect=${Astro.url.toString()}`
+ );
+ }
+
+ aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
+
+ if (!aufnahme) {
+ // Die Aufnahme existiert wohl nicht.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-gewerbe"
+ );
+ }
+
+ objekt = await getObjekt(aufnahme.objekt_id) as Objekt
+
+ if (!objekt) {
+ // Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
@@ -81,6 +82,6 @@ if (uid) {
}
---
-
-
+
+
\ No newline at end of file
diff --git a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
index a0b1cf47..467385b4 100644
--- a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
+++ b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
@@ -1,77 +1,79 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
-import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
-import { createCaller } from "src/astro-typesafe-api-caller";
-import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
-import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
-import { Enums } from "#lib/server/prisma";
+import { Aufnahme, Bild, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/server/prisma";
+import { getVerbrauchsausweisWohnen, getAufnahme, getObjekt, getBilder } from "#lib/server/db";
+import { getCurrentUser } from "#lib/server/user";
-const uid = Astro.url.searchParams.get("uid");
-const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard;
+const id = Astro.url.searchParams.get("id");
+const aufnahme_id = Astro.url.searchParams.get("aufnahme")
+let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
+const partner_code = Astro.params.partner as string;
+let ausweis: VerbrauchsausweisWohnen = {} as VerbrauchsausweisWohnen;
+let aufnahme: Aufnahme = {} as Aufnahme;
+let objekt: Objekt = {} as Objekt;
+let bilder: Bild[] = []
-let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
-let aufnahme: AufnahmeClient = {} as AufnahmeClient;
-let objekt: ObjektClient = {} as ObjektClient;
-let bilder: UploadedGebaeudeBild[] = []
+const user = await getCurrentUser(Astro)
-const valid = validateAccessTokenServer(Astro);
-
-const caller = createCaller(Astro);
-
-if (uid) {
- if (!valid) {
+if (id) {
+ if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
- try {
- ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid
- }
- });
+ ausweis = await getVerbrauchsausweisWohnen(id) as VerbrauchsausweisWohnen
+ ausweistyp = ausweis.ausweistyp;
- aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid: ausweis.uid_aufnahme
- }
- })
+ if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
+ // Der Ausweis scheint nicht zu existieren.
+ // Wir leiten auf die generische Ausweisseite ohne ID weiter.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
+ );
+ }
- objekt = await caller.objekt._uid.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid: ausweis.uid_objekt
- }
- })
+ aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
- bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
- headers: {
- authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
- },
- params: {
- uid: ausweis.uid_aufnahme
- }
- })
+ if (!aufnahme) {
+ // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
+ );
+ }
- if (!ausweis) {
- // Der Ausweis scheint nicht zu existieren.
- // Wir leiten auf die generische Ausweisseite ohne UID weiter.
- return Astro.redirect(
- "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
- );
- }
- } catch(e) {
+ objekt = await getObjekt(aufnahme.objekt_id) as Objekt
+
+ if (!objekt) {
+ // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
+ );
+ }
+
+ bilder = await getBilder(aufnahme.id);
+} else if (aufnahme_id) {
+ if (!user) {
+ return Astro.redirect(
+ `/auth/login?redirect=${Astro.url.toString()}`
+ );
+ }
+
+ aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
+
+ if (!aufnahme) {
+ // Die Aufnahme existiert wohl nicht.
+ return Astro.redirect(
+ "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
+ );
+ }
+
+ objekt = await getObjekt(aufnahme.objekt_id) as Objekt
+
+ if (!objekt) {
+ // Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
@@ -81,5 +83,5 @@ if (uid) {
---
-
+
diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts
index 9bbb345c..07f5861b 100644
--- a/src/pages/api/admin/ausstellen.ts
+++ b/src/pages/api/admin/ausstellen.ts
@@ -18,6 +18,13 @@ import { BASE_URI } from "#lib/constants.js";
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
import { PutObjectCommand } from "@aws-sdk/client-s3";
import { s3Client } from "#lib/s3.js";
+import { createInvoice, getLexOfficeRechnung } from "#lib/server/invoice.js";
+import { tryCatch } from "#lib/tryCatch.js";
+import {
+ getBedarfsausweisWohnenKomplett,
+ getVerbrauchsausweisGewerbeKomplett,
+ getVerbrauchsausweisWohnenKomplett,
+} from "#lib/server/db.js";
export const GET = defineApiRoute({
input: z.object({
@@ -25,7 +32,7 @@ export const GET = defineApiRoute({
}),
output: z.void(),
middleware: adminMiddleware,
- async fetch({ id_ausweis }, context, user) {
+ async fetch({ id_ausweis }, context) {
const ausweisart = getAusweisartFromId(id_ausweis);
let ausweis:
@@ -37,66 +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 prisma.verbrauchsausweisWohnen.findUnique({
- where: {
- id: id_ausweis,
- },
- include: {
- aufnahme: {
- include: {
- bilder: true,
- objekt: {
- include: {
- benutzer: true,
- },
- },
- },
- },
- },
- });
+ ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis);
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
- ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
- where: {
- id: id_ausweis,
- },
- include: {
- aufnahme: {
- include: {
- bilder: true,
- objekt: {
- include: {
- benutzer: true,
- },
- },
- },
- },
- },
- });
+ ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis);
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
- ausweis = await prisma.bedarfsausweisWohnen.findUnique({
- where: {
- id: id_ausweis,
- },
- include: {
- aufnahme: {
- include: {
- bilder: true,
- objekt: {
- include: {
- benutzer: true,
- },
- },
- },
- },
- },
- });
+ ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis);
}
if (!ausweis) {
@@ -115,6 +74,9 @@ export const GET = defineApiRoute({
orderBy: {
erstellt_am: "desc",
},
+ include: {
+ benutzer: true
+ }
});
if (!rechnung) {
@@ -125,34 +87,34 @@ export const GET = defineApiRoute({
});
}
- // TODO
- // SECTION: Rechnung erstellen (LexOffice)
- // Wir wollen die Rechnung an lex office versenden, und uns die ID von da holen.
- // Falls die Rechnung bereits existiert ist das nicht nötig.
- // if (!$rechnung->lex_office_id) {
- // [$lex_office_id, $renr] = createInvoice($ausweis, $rechnung);
- // sleep(1); // TODO: Nach der Umstellung von LexOffice auf etwas anderes MUSS das hier unbedingt entfernt werden!
+ if (!rechnung.lex_office_id) {
+ const [result, error] = await tryCatch(
+ createInvoice(ausweis, rechnung)
+ );
- // if (!$lex_office_id || !$renr) {
- // die("Bei der Erstellung der Rechnung ist etwas schiefgelaufen - Möglicherweise ist etwas mit LexOffice?");
- // }
+ if (error) {
+ return;
+ }
- // $rechnung->lex_office_id = $lex_office_id;
- // $rechnung->rechnungsnummer = $renr;
- // $rechnung->save();
- // }
+ const { id, voucherNumber } = result;
- // TODO
- // if ($ausweis->erledigt != 2) {$ausweis->erstellungsdatum = date("Y-m-d H:i:s");}
- // $ausweis->erledigt = 2;
- // $ausweis->save();
+ await prisma.rechnung.update({
+ where: {
+ id: rechnung.id,
+ },
+ data: {
+ lex_office_id: id,
+ },
+ });
+ }
const pdfAusweis = await getAnsichtsausweis(
ausweis,
ausweis.aufnahme,
ausweis.aufnahme.objekt,
ausweis.aufnahme.bilder,
- ausweis.aufnahme.objekt.benutzer
+ ausweis.aufnahme.objekt.benutzer,
+ false
);
const pdfDatenblatt = await getDatenblatt(
ausweis,
@@ -162,33 +124,61 @@ export const GET = defineApiRoute({
ausweis.aufnahme.objekt.benutzer
);
- if (pdfAusweis) {
- const command = new PutObjectCommand({
- Bucket: "ibc-pdfs",
- Key: `ID_${ausweis.id}_Energieausweis.pdf`,
- Body: pdfAusweis,
- ACL: "private",
- });
+ const [pdfRechnung, pdfRechnungError] = await tryCatch(getLexOfficeRechnung(rechnung));
- const response = await s3Client.send(command);
+ if (pdfRechnungError) {
+ throw new APIError({
+ code: "INTERNAL_SERVER_ERROR",
+ message: "Rechnungs PDF konnte nicht generiert werden."
+ })
}
- if (pdfDatenblatt) {
- const command = new PutObjectCommand({
- Bucket: "ibc-pdfs",
- Key: `ID_${ausweis.id}_Energieausweis.pdf`,
- Body: pdfDatenblatt,
- ACL: "private",
- });
-
- const response = await s3Client.send(command);
+ if (!pdfAusweis) {
+ throw new APIError({
+ code: "INTERNAL_SERVER_ERROR",
+ message: "Ausweis PDF konnte nicht generiert werden."
+ })
}
- let text: string;
+ if (!pdfDatenblatt) {
+ throw new APIError({
+ code: "INTERNAL_SERVER_ERROR",
+ message: "Datenblatt PDF konnte nicht generiert werden."
+ })
+ }
+
+ const ausweisCommand = new PutObjectCommand({
+ Bucket: "ibc-pdfs",
+ Key: `ID_${ausweis.id}_Energieausweis.pdf`,
+ Body: pdfAusweis,
+ ACL: "private",
+ });
+
+ await s3Client.send(ausweisCommand);
+
+ const datenblattCommand = new PutObjectCommand({
+ Bucket: "ibc-pdfs",
+ Key: `ID_${ausweis.id}_Datenblatt.pdf`,
+ Body: pdfDatenblatt,
+ ACL: "private",
+ });
+
+ await s3Client.send(datenblattCommand);
+
+ const rechnungsCommand = new PutObjectCommand({
+ Bucket: "ibc-pdfs",
+ Key: `ID_${ausweis.id}_Rechnung.pdf`,
+ Body: pdfDatenblatt,
+ ACL: "private",
+ });
+
+ await s3Client.send(rechnungsCommand);
+
+ let html: string;
if (rechnung.status === Enums.Rechnungsstatus.paid) {
- text = `
-Sehr geehrte*r ${user.vorname} ${user.name},
+ html = `
+Sehr geehrte*r ${rechnung.empfaenger},
im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.
@@ -214,8 +204,8 @@ fon 040 · 209339850
fax 040 · 209339859
`;
} else {
- text = `
-Sehr geehrte*r ${user.vorname} ${user.name},
+ html = `
+Sehr geehrte*r ${rechnung.empfaenger},
im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Nachfolgend finden Sie unsere Bankverbindung. Bitte geben Sie als Verwendungszweck die Rechnungsnummer an (siehe unten). Vielen Dank.
@@ -269,9 +259,58 @@ fax 040 · 209339859
await transport.sendMail({
from: `"IBCornelsen" `,
- to: user.email,
+ to: rechnung.email || rechnung.benutzer.email,
+ bcc: "info@online-energieausweis.org",
subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`,
- text,
+ html,
+ attachments: [{
+ filename: `ID_${ausweis.id}_Ansichtsausweis.pdf`,
+ encoding: "binary",
+ content: Buffer.from(pdfAusweis),
+ contentType: "application/pdf",
+ contentDisposition: "attachment",
+ }, {
+ filename: `ID_${ausweis.id}_Datenblatt.pdf`,
+ encoding: "binary",
+ content: Buffer.from(pdfDatenblatt),
+ contentType: "application/pdf",
+ contentDisposition: "attachment",
+ }, {
+ filename: `ID_${ausweis.id}_Rechnung.pdf`,
+ encoding: "binary",
+ content: Buffer.from(pdfRechnung),
+ contentType: "application/pdf",
+ contentDisposition: "attachment",
+ }]
});
+
+ 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,
+ },
+ data: {
+ ausgestellt: true,
+ },
+ });
+ }
},
});
diff --git a/src/pages/api/admin/registriernummer.ts b/src/pages/api/admin/registriernummer.ts
index 02c89216..f8ceed75 100644
--- a/src/pages/api/admin/registriernummer.ts
+++ b/src/pages/api/admin/registriernummer.ts
@@ -7,10 +7,7 @@ import {
authorizationHeaders,
} from "#lib/middleware/authorization.js";
import {
- BedarfsausweisWohnen,
Enums,
- VerbrauchsausweisGewerbe,
- VerbrauchsausweisWohnen,
} from "#lib/server/prisma.js";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -21,14 +18,14 @@ import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
export const GET = defineApiRoute({
input: z.object({
- uid: UUidWithPrefix,
+ id: UUidWithPrefix,
}),
headers: authorizationHeaders,
middleware: adminMiddleware,
- async fetch({ uid }, context, user) {
- const ausweisart = getAusweisartFromId(uid);
+ async fetch({ id }, context, user) {
+ const ausweisart = getAusweisartFromId(id);
const adapter = getPrismaAusweisAdapter(
- uid
+ id
) as typeof prisma.verbrauchsausweisWohnen;
if (!adapter) {
@@ -40,7 +37,7 @@ export const GET = defineApiRoute({
const ausweis = await adapter.findUnique({
where: {
- uid,
+ id,
},
include: {
aufnahme: {
@@ -125,32 +122,27 @@ export const GET = defineApiRoute({
? "Energiebedarfsausweis"
: "Energieverbrauchsausweis";
- const body = `
-
-
-
- ${Aussteller_ID_DIBT}
- ${Aussteller_PWD_DIBT}
-
-
- ${Ausstellungsdatum}
- ${postleitzahl.bundesland}
- ${postleitzahl.plz}
- ${Gesetzesgrundlage}
-
-
- ${gebaeudeart}
- ${art}
- ${
- ausweis.ausstellgrund ===
- Enums.Ausstellgrund.Neubau
- ? "1"
- : "0"
- }
-
-
-
- `;
+ const requestPayload = {
+ doc: {
+ root: {
+ Authentifizierung: {
+ Aussteller_ID_DIBT: Aussteller_ID_DIBT,
+ Aussteller_PWD_DIBT: Aussteller_PWD_DIBT,
+ },
+ 'EnEV-Nachweis': {
+ Ausstellungsdatum: Ausstellungsdatum,
+ Bundesland: postleitzahl.bundesland,
+ Postleitzahl: postleitzahl.plz,
+ Gesetzesgrundlage: Gesetzesgrundlage,
+ },
+ 'Energieausweis-Daten': {
+ Gebaeudeart: gebaeudeart,
+ Art: art,
+ Neubau: ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau ? "1" : "0",
+ },
+ },
+ },
+ }
return await new Promise(async (resolve, reject) => {
soap.createClient(
@@ -165,7 +157,7 @@ export const GET = defineApiRoute({
}
client.Datenregistratur(
- body,
+ requestPayload,
async function (
err: any,
result: {
@@ -193,7 +185,7 @@ export const GET = defineApiRoute({
adapter as typeof prisma.verbrauchsausweisWohnen
).update({
where: {
- uid,
+ id,
},
data: {
registriernummer:
diff --git a/src/pages/api/bedarfsausweis-gewerbe/[id].ts b/src/pages/api/bedarfsausweis-gewerbe/[id].ts
index 1ab158aa..bab820d7 100644
--- a/src/pages/api/bedarfsausweis-gewerbe/[id].ts
+++ b/src/pages/api/bedarfsausweis-gewerbe/[id].ts
@@ -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: {
diff --git a/src/pages/api/bedarfsausweis-gewerbe/index.ts b/src/pages/api/bedarfsausweis-gewerbe/index.ts
index a9611fa3..101777e5 100644
--- a/src/pages/api/bedarfsausweis-gewerbe/index.ts
+++ b/src/pages/api/bedarfsausweis-gewerbe/index.ts
@@ -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
}),
diff --git a/src/pages/api/bedarfsausweis-wohnen/[id].ts b/src/pages/api/bedarfsausweis-wohnen/[id].ts
index 45d1cbc7..e4b1d970 100644
--- a/src/pages/api/bedarfsausweis-wohnen/[id].ts
+++ b/src/pages/api/bedarfsausweis-wohnen/[id].ts
@@ -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: {
diff --git a/src/pages/api/bedarfsausweis-wohnen/index.ts b/src/pages/api/bedarfsausweis-wohnen/index.ts
index a45411f4..1969a411 100644
--- a/src/pages/api/bedarfsausweis-wohnen/index.ts
+++ b/src/pages/api/bedarfsausweis-wohnen/index.ts
@@ -29,6 +29,7 @@ export const PUT = defineApiRoute({
created_at: true,
updated_at: true,
storniert: true,
+ ausweisart: true
}),
aufnahme_id: UUidWithPrefix,
}),
@@ -51,7 +52,7 @@ export const PUT = defineApiRoute({
}
const id = generatePrefixedId(
- 6,
+ 9,
VALID_UUID_PREFIXES.BedarfsausweisWohnen
);
diff --git a/src/pages/api/geg-nachweis-gewerbe/[id].ts b/src/pages/api/geg-nachweis-gewerbe/[id].ts
index d5b5f74c..97904b9b 100644
--- a/src/pages/api/geg-nachweis-gewerbe/[id].ts
+++ b/src/pages/api/geg-nachweis-gewerbe/[id].ts
@@ -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: {
diff --git a/src/pages/api/geg-nachweis-gewerbe/index.ts b/src/pages/api/geg-nachweis-gewerbe/index.ts
index f53625ae..457f140c 100644
--- a/src/pages/api/geg-nachweis-gewerbe/index.ts
+++ b/src/pages/api/geg-nachweis-gewerbe/index.ts
@@ -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
}),
diff --git a/src/pages/api/geg-nachweis-wohnen/[id].ts b/src/pages/api/geg-nachweis-wohnen/[id].ts
index 82d0a4b5..5a7f2053 100644
--- a/src/pages/api/geg-nachweis-wohnen/[id].ts
+++ b/src/pages/api/geg-nachweis-wohnen/[id].ts
@@ -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: {
diff --git a/src/pages/api/geg-nachweis-wohnen/index.ts b/src/pages/api/geg-nachweis-wohnen/index.ts
index 769dc9e1..6d101626 100644
--- a/src/pages/api/geg-nachweis-wohnen/index.ts
+++ b/src/pages/api/geg-nachweis-wohnen/index.ts
@@ -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
}),
diff --git a/src/pages/api/rechnung/anfordern.ts b/src/pages/api/rechnung/anfordern.ts
index ffe543a4..ba1a21cf 100644
--- a/src/pages/api/rechnung/anfordern.ts
+++ b/src/pages/api/rechnung/anfordern.ts
@@ -51,9 +51,6 @@ export const PUT = defineApiRoute({
"message": `Ausweisart wird nicht unterstützt: ${ausweisart}`
})
}
-
- console.log(nachweis);
-
if (!nachweis || nachweis.benutzer_id !== user.id) {
throw new APIError({
diff --git a/src/pages/api/rechnung/index.ts b/src/pages/api/rechnung/index.ts
index 4389efac..6f0edc81 100644
--- a/src/pages/api/rechnung/index.ts
+++ b/src/pages/api/rechnung/index.ts
@@ -101,6 +101,19 @@ export const PUT = defineApiRoute({
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
+ abweichende_versand_adresse: input.abweichende_versand_adresse,
+ email: input.email,
+ empfaenger: input.empfaenger,
+ ort: input.ort,
+ plz: input.plz,
+ strasse: input.strasse,
+ telefon: input.telefon,
+ versand_ort: input.versand_ort,
+ versand_empfaenger: input.versand_empfaenger,
+ versand_plz: input.versand_plz,
+ versand_strasse: input.versand_strasse,
+ versand_zusatzzeile: input.versand_zusatzzeile,
+ zusatzzeile: input.zusatzzeile,
verbrauchsausweis_wohnen: {
connect: {
id: ausweis_id
@@ -118,6 +131,19 @@ export const PUT = defineApiRoute({
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
+ abweichende_versand_adresse: input.abweichende_versand_adresse,
+ email: input.email,
+ empfaenger: input.empfaenger,
+ ort: input.ort,
+ plz: input.plz,
+ strasse: input.strasse,
+ telefon: input.telefon,
+ versand_ort: input.versand_ort,
+ versand_empfaenger: input.versand_empfaenger,
+ versand_plz: input.versand_plz,
+ versand_strasse: input.versand_strasse,
+ versand_zusatzzeile: input.versand_zusatzzeile,
+ zusatzzeile: input.zusatzzeile,
verbrauchsausweis_gewerbe: {
connect: {
id: ausweis_id
@@ -135,6 +161,19 @@ export const PUT = defineApiRoute({
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
+ abweichende_versand_adresse: input.abweichende_versand_adresse,
+ email: input.email,
+ empfaenger: input.empfaenger,
+ ort: input.ort,
+ plz: input.plz,
+ strasse: input.strasse,
+ telefon: input.telefon,
+ versand_ort: input.versand_ort,
+ versand_empfaenger: input.versand_empfaenger,
+ versand_plz: input.versand_plz,
+ versand_strasse: input.versand_strasse,
+ versand_zusatzzeile: input.versand_zusatzzeile,
+ zusatzzeile: input.zusatzzeile,
bedarfsausweis_wohnen: {
connect: {
id: ausweis_id
@@ -178,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}`
});
diff --git a/src/pages/api/user/index.ts b/src/pages/api/user/index.ts
index f035cc00..beb42b3c 100644
--- a/src/pages/api/user/index.ts
+++ b/src/pages/api/user/index.ts
@@ -3,6 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { adminMiddleware, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { hashPassword } from "#lib/password.js";
+import { createLexOfficeCustomer } from "#lib/server/lexoffice.js";
import { sendRegisterMail } from "#lib/server/mail/registrierung.js";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -117,6 +118,17 @@ export const PUT = defineApiRoute({
}
})
+ const lex_office_id = await createLexOfficeCustomer(user);
+
+ await prisma.benutzer.update({
+ where: {
+ id: user.id
+ },
+ data: {
+ lex_office_id
+ }
+ })
+
await sendRegisterMail(user)
return { id }
diff --git a/src/pages/api/verbrauchsausweis-gewerbe/[id].ts b/src/pages/api/verbrauchsausweis-gewerbe/[id].ts
index ad7ef741..ca3fdd54 100644
--- a/src/pages/api/verbrauchsausweis-gewerbe/[id].ts
+++ b/src/pages/api/verbrauchsausweis-gewerbe/[id].ts
@@ -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(),
})),
diff --git a/src/pages/api/verbrauchsausweis-gewerbe/index.ts b/src/pages/api/verbrauchsausweis-gewerbe/index.ts
index 4a75ffea..f18f9fa3 100644
--- a/src/pages/api/verbrauchsausweis-gewerbe/index.ts
+++ b/src/pages/api/verbrauchsausweis-gewerbe/index.ts
@@ -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()
})),
diff --git a/src/pages/api/verbrauchsausweis-wohnen/[id].ts b/src/pages/api/verbrauchsausweis-wohnen/[id].ts
index 1096245d..98fac976 100644
--- a/src/pages/api/verbrauchsausweis-wohnen/[id].ts
+++ b/src/pages/api/verbrauchsausweis-wohnen/[id].ts
@@ -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()
})),
diff --git a/src/pages/api/verbrauchsausweis-wohnen/index.ts b/src/pages/api/verbrauchsausweis-wohnen/index.ts
index ca2f97f4..24a3a904 100644
--- a/src/pages/api/verbrauchsausweis-wohnen/index.ts
+++ b/src/pages/api/verbrauchsausweis-wohnen/index.ts
@@ -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
}),
diff --git a/src/pages/api/webhooks/mollie.ts b/src/pages/api/webhooks/mollie.ts
index 1c3611bf..16d12d69 100644
--- a/src/pages/api/webhooks/mollie.ts
+++ b/src/pages/api/webhooks/mollie.ts
@@ -19,7 +19,7 @@ export const POST = defineApiRoute({
// Wir holen uns die Transaktion von Mollie.
const payment = await mollieClient.payments.get(id);
- const metadata = payment.metadata as { rechnung_uid: string }
+ const metadata = payment.metadata as { rechnung_id: string }
if (!payment) {
throw new APIError({
@@ -28,7 +28,7 @@ export const POST = defineApiRoute({
});
}
- if (!metadata.rechnung_uid) {
+ if (!metadata.rechnung_id) {
throw new APIError({
code: "BAD_REQUEST",
message: "Rechnung UID nicht gefunden.",
@@ -38,7 +38,7 @@ export const POST = defineApiRoute({
// Wir holen uns die Rechnung aus unserer Datenbank.
const rechnung = await prisma.rechnung.findUnique({
where: {
- uid: metadata.rechnung_uid,
+ id: metadata.rechnung_id,
},
});
@@ -57,6 +57,7 @@ export const POST = defineApiRoute({
data: {
status: payment.status as Enums.Rechnungsstatus,
transaktions_referenz: payment.id,
+ bezahlt_am: new Date()
},
});
},
diff --git a/src/pages/dashboard/admin/impersonate-user.astro b/src/pages/dashboard/admin/impersonate-user.astro
index 871346c1..802614f2 100644
--- a/src/pages/dashboard/admin/impersonate-user.astro
+++ b/src/pages/dashboard/admin/impersonate-user.astro
@@ -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: {
diff --git a/src/pages/dashboard/admin/impersonate.astro b/src/pages/dashboard/admin/impersonate.astro
index 62c2617c..69e9043d 100644
--- a/src/pages/dashboard/admin/impersonate.astro
+++ b/src/pages/dashboard/admin/impersonate.astro
@@ -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")
---
\ No newline at end of file
diff --git a/src/pages/dashboard/ausweise/index.astro b/src/pages/dashboard/ausweise/index.astro
deleted file mode 100644
index 4a49e830..00000000
--- a/src/pages/dashboard/ausweise/index.astro
+++ /dev/null
@@ -1,21 +0,0 @@
----
-import UserLayout from "#layouts/DashboardLayout.astro";
-import DashboardAusweiseModule from "#modules/Dashboard/DashboardAusweiseModule.svelte";
-
-import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
-import { createCaller } from "src/astro-typesafe-api-caller";
-
-const accessTokenValid = await validateAccessTokenServer(Astro);
-
-if (!accessTokenValid) {
- return Astro.redirect("/auth/login")
-}
-
-const caller = createCaller(Astro);
-
-const user = await caller.v1.benutzer.self();
----
-
-
-
-
\ No newline at end of file
diff --git a/src/pages/dashboard/objekte/[page].astro b/src/pages/dashboard/objekte/[page].astro
index 5baa2df3..455ca2a0 100644
--- a/src/pages/dashboard/objekte/[page].astro
+++ b/src/pages/dashboard/objekte/[page].astro
@@ -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")
@@ -43,7 +35,9 @@ const objekte = await prisma.objekt.findMany({
every: {
verbrauchsausweise_gewerbe: {
some: {
- id
+ id: {
+ contains: id
+ }
}
},
}
@@ -54,7 +48,9 @@ const objekte = await prisma.objekt.findMany({
every: {
verbrauchsausweise_wohnen: {
some: {
- id
+ id: {
+ contains: id
+ }
}
},
}
@@ -65,7 +61,9 @@ const objekte = await prisma.objekt.findMany({
every: {
bedarfsausweise_wohnen: {
some: {
- id
+ id: {
+ contains: id
+ }
}
},
}
diff --git a/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro b/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro
index d5280bea..77528d1e 100644
--- a/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro
+++ b/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro
@@ -27,7 +27,7 @@ if (id) {
ausweis = await getBedarfsausweisWohnen(id) as BedarfsausweisWohnen
ausweistyp = ausweis.ausweistyp;
- if (!ausweis || ausweis.benutzer_id !== user.id) {
+ if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
return Astro.redirect(
diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
index ebc5b35c..744699cc 100644
--- a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
+++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
@@ -27,7 +27,7 @@ if (id) {
ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe
ausweistyp = ausweis.ausweistyp;
- if (!ausweis || ausweis.benutzer_id !== user.id) {
+ if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
return Astro.redirect(
diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
index d2bb033c..3923b2b0 100644
--- a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
+++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
@@ -1,7 +1,6 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
-import { AufnahmeClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { Aufnahme, Bild, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/server/prisma";
import { getAufnahme, getBilder, getObjekt, getVerbrauchsausweisWohnen } from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";
@@ -27,7 +26,7 @@ if (id) {
ausweis = await getVerbrauchsausweisWohnen(id) as VerbrauchsausweisWohnen
ausweistyp = ausweis.ausweistyp;
- if (!ausweis || ausweis.benutzer_id !== user.id) {
+ if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
return Astro.redirect(
@@ -82,5 +81,5 @@ if (id) {
---
-
+
diff --git a/src/pages/pdf/ansichtsausweis.ts b/src/pages/pdf/ansichtsausweis.ts
index 472d37d0..5b4028f2 100644
--- a/src/pages/pdf/ansichtsausweis.ts
+++ b/src/pages/pdf/ansichtsausweis.ts
@@ -50,9 +50,9 @@ export const GET: APIRoute = async (Astro) => {
// Dieser Ausweis wurde mit der alten Version erstellt, das PDF sollte bereits existieren.
pdf = await getS3File("ibc-pdfs", `ID_${id[1]}_Energieausweis.pdf`)
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
- pdf = await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user);
+ pdf = await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user, !ausweis.ausgestellt);
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
- pdf = await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user);
+ pdf = await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, !ausweis.ausgestellt);
}
return new Response(pdf, {
diff --git a/src/testing/daten-umziehen.ts b/src/testing/daten-umziehen.ts
index 30ecb490..915d2f40 100644
--- a/src/testing/daten-umziehen.ts
+++ b/src/testing/daten-umziehen.ts
@@ -138,11 +138,11 @@ Papa.parse(file, {
}
const aufnahme_id = generatePrefixedId(
- 6,
+ 9,
VALID_UUID_PREFIXES.Aufnahme
);
- const aufnahme = await prisma.aufnahme.create({
+ const [aufnahme, aufnahme_error] = await tryCatch(prisma.aufnahme.create({
data: {
id: aufnahme_id,
alternative_heizung: dataset.alheizung == "1",
@@ -243,7 +243,12 @@ Papa.parse(file, {
zentralheizung: dataset.zentralheizung == "1",
zirkulation: dataset.zirkulation == "1",
},
- });
+ }));
+
+ if (aufnahme_error) {
+ console.log(aufnahme_error);
+ continue;
+ }
/* -------------------------------- Bilder ------------------------------- */
try {