Compare commits
28 Commits
dev-jens-m
...
revert-507
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3cb71b8e2c | ||
|
|
eb8bae6d69 | ||
|
|
4f382c150d | ||
|
|
53ea51885a | ||
|
|
f5ae2cd0d4 | ||
|
|
8860750487 | ||
|
|
a58c8d466e | ||
|
|
8daee69576 | ||
|
|
7665141a5a | ||
|
|
7327d39c57 | ||
|
|
9177ca18f0 | ||
|
|
0956744878 | ||
|
|
b0235056a7 | ||
|
|
d354189d3c | ||
|
|
07760aa26a | ||
|
|
13322836aa | ||
|
|
d8acd0476a | ||
|
|
a2e0d50b1f | ||
|
|
176f1c08ad | ||
|
|
1970a105a9 | ||
|
|
71438a39eb | ||
|
|
ba7792a4b9 | ||
|
|
145bf46ee1 | ||
|
|
ecdce5b279 | ||
|
|
c0d4ede483 | ||
|
|
3fa207ea9c | ||
|
|
2a302a4b59 | ||
|
|
42e0907bb9 |
10
.github/workflows/dev-pipeline.yml
vendored
10
.github/workflows/dev-pipeline.yml
vendored
@@ -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
|
||||
33
.github/workflows/prod-pipeline.yml
vendored
Normal file
33
.github/workflows/prod-pipeline.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
name: Production Pipeline
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
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
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -34,7 +34,7 @@ dbml/schema.dbml
|
||||
|
||||
prisma/migrations/20250315143314_/migration.sql
|
||||
|
||||
src/astro-typesafe-api-caller.ts
|
||||
# src/astro-typesafe-api-caller.ts
|
||||
|
||||
src/testing/ausweise.csv
|
||||
src/testing/users.csv
|
||||
|
||||
@@ -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
|
||||
@@ -96,7 +96,7 @@
|
||||
"postcss-import": "^16.1.0",
|
||||
"postcss-nesting": "^13.0.1",
|
||||
"prettier": "^2.8.8",
|
||||
"prisma": "^6.4.1",
|
||||
"prisma": "6.4.1",
|
||||
"prisma-dbml-generator": "^0.12.0",
|
||||
"prisma-generator-fake-data": "^0.14.3",
|
||||
"tsx": "^4.19.3",
|
||||
|
||||
17
prisma/migrations/20250409152238_ausweis_id/migration.sql
Normal file
17
prisma/migrations/20250409152238_ausweis_id/migration.sql
Normal file
@@ -0,0 +1,17 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "BedarfsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisGewerbe';
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "BedarfsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisWohnen';
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "GEGNachweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisGewerbe';
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "GEGNachweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisWohnen';
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "VerbrauchsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisGewerbe';
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "VerbrauchsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisWohnen';
|
||||
@@ -26,6 +26,7 @@ model BedarfsausweisGewerbe {
|
||||
klimatisierung Boolean? @default(false)
|
||||
|
||||
nachweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(BedarfsausweisGewerbe)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
@@ -100,6 +100,7 @@ model BedarfsausweisWohnen {
|
||||
pruefpunkt_fenster Boolean? @default(false)
|
||||
|
||||
ausweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(BedarfsausweisWohnen)
|
||||
|
||||
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ model GEGNachweisGewerbe {
|
||||
beschreibung String? @db.Text
|
||||
|
||||
nachweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(GEGNachweisGewerbe)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
@@ -17,6 +17,7 @@ model GEGNachweisWohnen {
|
||||
beschreibung String? @db.Text
|
||||
|
||||
nachweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(GEGNachweisWohnen)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
@@ -74,6 +74,7 @@ model VerbrauchsausweisGewerbe {
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
ausweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(VerbrauchsausweisGewerbe)
|
||||
|
||||
pruefpunkt_heizungsalter Boolean? @default(false)
|
||||
pruefpunkt_verbrauch_niedrig Boolean? @default(false)
|
||||
|
||||
@@ -75,6 +75,7 @@ model VerbrauchsausweisWohnen {
|
||||
kontrolldatei_angefragt Boolean? @default(false)
|
||||
|
||||
ausweistyp AusweisTyp @default(Standard)
|
||||
ausweisart Ausweisart @default(VerbrauchsausweisWohnen)
|
||||
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt @default(now())
|
||||
|
||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 10 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 7.4 KiB |
Binary file not shown.
41
recover-db-dev.bash
Normal file
41
recover-db-dev.bash
Normal file
@@ -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"
|
||||
@@ -1,45 +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"),
|
||||
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
|
||||
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
|
||||
"ausweise": await import("../src/pages/api/ausweise/index.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"),
|
||||
"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"),
|
||||
"user": await import("../src/pages/api/user/index.ts"),
|
||||
"user/self": await import("../src/pages/api/user/self.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"),
|
||||
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
|
||||
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
|
||||
"verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"),
|
||||
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
||||
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.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"),
|
||||
})
|
||||
@@ -1,5 +1,4 @@
|
||||
import { api } from "astro-typesafe-api/client";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import Cookies from "js-cookie";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import {
|
||||
@@ -566,7 +565,7 @@ export async function ausweisSpeichern(
|
||||
return;
|
||||
}
|
||||
|
||||
aufnahme.id = aufnahme_id;
|
||||
aufnahme.id = aufnahme_id as string;
|
||||
|
||||
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
const id = await verbrauchsausweisWohnenSpeichern(
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<script lang="ts">
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
||||
import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte";
|
||||
import {
|
||||
BedarfsausweisWohnenClient,
|
||||
@@ -9,8 +8,9 @@
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "./types.js";
|
||||
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
|
||||
import { Enums } from "#lib/client/prisma";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||
import { Enums } from "#lib/client/prisma.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
@@ -21,7 +21,9 @@
|
||||
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000,
|
||||
[Enums.Ausweisart.VerbrauchsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisWohnen]: 250,
|
||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: 250
|
||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: 0,
|
||||
[Enums.Ausweisart.GEGNachweisGewerbe]: 0,
|
||||
[Enums.Ausweisart.GEGNachweisWohnen]: 0,
|
||||
}[ausweisart];
|
||||
|
||||
/**
|
||||
@@ -64,9 +66,9 @@
|
||||
(async () => {
|
||||
let result;
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
result = await endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
||||
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt);
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
|
||||
@@ -15,8 +15,9 @@
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import { Enums, Objekt } from "#lib/client/prisma.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||
import { addNotification } from "#components/Notifications/shared.js";
|
||||
import moment from "moment";
|
||||
import { addNotification, updateNotification } from "#components/Notifications/shared.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
|
||||
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||
export let aufnahme: AufnahmeKomplettClient;
|
||||
@@ -87,15 +88,15 @@
|
||||
let calculations = null;
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
calculations = endEnergieVerbrauchVerbrauchsausweis_2016(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt);
|
||||
calculations = endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
calculations = endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt);
|
||||
calculations = endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt);
|
||||
}
|
||||
|
||||
async function registriernummerAnfordern() {
|
||||
async function registriernummer() {
|
||||
try {
|
||||
const result = await api.admin.registriernummer.GET.fetch({
|
||||
uid: ausweis.id
|
||||
id: ausweis.id
|
||||
}, {
|
||||
headers: {
|
||||
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||
@@ -142,7 +143,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function ausweisAusstellen() {
|
||||
async function ausstellen() {
|
||||
const notification = addNotification({
|
||||
message: "Ausweis wird ausgestellt.",
|
||||
subtext: "Der Ausweis wird nun ausgestellt, bitte habe einen Augenblick geduld..",
|
||||
type: "info",
|
||||
timeout: 0,
|
||||
})
|
||||
try {
|
||||
await api.admin.ausstellen.GET.fetch({
|
||||
id_ausweis: ausweis.id
|
||||
@@ -151,8 +158,17 @@
|
||||
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||
}
|
||||
})
|
||||
|
||||
ausweis.ausgestellt = true;
|
||||
|
||||
updateNotification(notification, {
|
||||
message: "Ausweis ausgestellt.",
|
||||
subtext: "Der Ausweis wurde erfolgreich ausgestellt.",
|
||||
timeout: 3000,
|
||||
type: "success",
|
||||
})
|
||||
} catch(e) {
|
||||
addNotification({
|
||||
updateNotification(notification, {
|
||||
message: "Das hat nicht geklappt.",
|
||||
subtext: e as string,
|
||||
timeout: 3000,
|
||||
@@ -162,63 +178,7 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="mx-auto py-6 px-4 box bg-white">
|
||||
|
||||
<!-- Obere Zeile: Titel -->
|
||||
<div class="border-b flex flex-row pb-2">
|
||||
<div class="text-xl font-bold">
|
||||
Verbrauchsausweis Wohnen mit Beratung (Post, Same Day)
|
||||
</div>
|
||||
<div class="bg-red-600 ml-auto px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</div>
|
||||
</div>
|
||||
|
||||
<!-- Navigation (1/3) -->
|
||||
<div class="border-b pt-4 mb-4 flex justify-between items-center">
|
||||
<button class="bg-gray-300 text-gray-700 px-2 py-1 rounded hover:bg-gray-400">
|
||||
«
|
||||
</button>
|
||||
<p class="text-gray-700 font-medium">
|
||||
Ausweis 1/3
|
||||
</p>
|
||||
<button class="bg-gray-300 text-gray-700 px-2 py-1 rounded hover:bg-gray-400">
|
||||
»
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Erster Block: Drei Spalten -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-4">
|
||||
<!-- Linke Spalte: Bild + ID -->
|
||||
<div class="flex-shrink-0 bg-gray-100 flex flex-col items-center border text-2xl rounded-b-lg pb-2">
|
||||
<img
|
||||
src="../../images/placeholder.png"
|
||||
alt="Gebäudevorschau"
|
||||
class="rounded-t-lg mb-2"
|
||||
/>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-2 bg-white">
|
||||
<!-- PDF-Icon / Ausweis -->
|
||||
<div class="m-4">
|
||||
<img
|
||||
src="../../images/dashboard/AusweisKreuz.svg"
|
||||
alt="PDF Symbol für Verbrauchsausweis"
|
||||
class="h-auto w-auto p-2 border border-black rounded-lg"
|
||||
/>
|
||||
<span class="text-sm font-medium ml-4">Verbrauchsausweis</span>
|
||||
</div>
|
||||
<!-- PDF-Icon / Datenblatt -->
|
||||
<div class="m-4">
|
||||
<img
|
||||
src="../../images/dashboard/DatenblattKreuz.svg"
|
||||
alt="PDF Symbol für Datenblatt"
|
||||
class="h-auto w-auto p-2 border border-black rounded-lg"
|
||||
/>
|
||||
<span class="text-sm font-medium ml-4">Datenblatt</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4">Ausweis ID: <b>BWWICR32</b></div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4">
|
||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mr-4">
|
||||
{#if ausweis.storniert}
|
||||
<div
|
||||
class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none"
|
||||
@@ -284,7 +244,11 @@
|
||||
{:else if ausweis.bestellt}
|
||||
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
|
||||
{:else}
|
||||
{#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
|
||||
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
|
||||
{:else}
|
||||
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Angefordert</span>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
<div class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div>
|
||||
@@ -301,7 +265,7 @@
|
||||
<p class="text-sm font-semibold">Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden innerhalb der nächsten 48 Stunden über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.</p>
|
||||
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
||||
<p class="text-sm font-semibold">Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen Ihres Energieversorgers.</p>
|
||||
{:else}
|
||||
{:else if !ausweis.ausgestellt}
|
||||
<p class="text-sm font-semibold">Der Ausweis wurde von Ihnen freigegeben und befindet sich in Prüfung vom IB Cornelsen</p>
|
||||
{/if}
|
||||
{/if}
|
||||
@@ -434,7 +398,6 @@
|
||||
{/if}
|
||||
|
||||
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
||||
<!-- TODO -->
|
||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||
<a
|
||||
class="button text-sm"
|
||||
@@ -445,13 +408,18 @@
|
||||
class="button text-sm"
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}"
|
||||
>Formular</a>
|
||||
{:else if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
|
||||
<a
|
||||
class="button text-sm"
|
||||
href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?id={ausweis.id}"
|
||||
>Formular</a>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
||||
<button class="button text-sm" on:click={ausweisAusstellen}>A</button>
|
||||
<button class="button text-sm" on:click={ausstellen}>A</button>
|
||||
<button class="button text-sm" on:click={stornieren}>S</button>
|
||||
<button class="button text-sm" on:click={registriernummerAnfordern}>R</button>
|
||||
<button class="button text-sm" on:click={registriernummer}>R</button>
|
||||
{/if}
|
||||
|
||||
<a
|
||||
@@ -474,94 +442,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex-shrink-0 bg-gray-100 flex flex-col border text-xl rounded-lg p-4">
|
||||
|
||||
<h3 class="font-bold">Ausweisdaten</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Anlass</td>
|
||||
<td>{ausweis.ausstellgrund}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gebäudetyp</td>
|
||||
<td>{aufnahme.gebaeudetyp}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Anzahl Wohneinheiten</td>
|
||||
<td>{aufnahme.einheiten}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Gebäudeteil</td>
|
||||
<td>{aufnahme.gebaeudeteil}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 class="font-bold">Heizverbräuche ({ausweis.einheit_1}, {ausweis.einheit_2})</h3>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>{ausweis.brennstoff_1}<br>{ausweis.brennstoff_2}</td>
|
||||
<td>{ausweis.verbrauch_1}, {ausweis.verbrauch_2}, {ausweis.verbrauch_3}<br>{ausweis.verbrauch_4}, {ausweis.verbrauch_5}, {ausweis.verbrauch_6}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{ausweis.warmwasser_enthalten ? "Warmwasser enthalten" : "Warmwasser nicht enthalten"}</td>
|
||||
<td>{ausweis.anteil_warmwasser}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Alternative Energieversorgung</td>
|
||||
<td>{aufnahme.alternative_heizung ? "Heizung" : ""}, {aufnahme.alternative_warmwasser ? "Warmwasser" : ""} {aufnahme.alternative_lueftung ? "Lüftung" : ""} {aufnahme.alternative_kuehlung ? "Kühlung" : ""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Leerstand</td>
|
||||
<td>{aufnahme.leerstand}</td>
|
||||
</tr>
|
||||
<!-- <tr>
|
||||
<td>{aufnahme.lueftung}</td>
|
||||
<td>{aufnahme.kuehlung}</td>
|
||||
</tr> -->
|
||||
<!-- <tr>
|
||||
<td>Sanierungszustand: Zentralheizung</td>
|
||||
</tr> -->
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Zweiter Block: Ansprechpartner und Ausweisdaten in zwei Spalten -->
|
||||
<div class="flex flex-row md:flex-row gap-4 mb-4">
|
||||
|
||||
<p class="text-lg text-gray-700 mb-1">
|
||||
<strong>Besteller:</strong> {benutzer.vorname} {benutzer.name}
|
||||
</p>
|
||||
<p class="text-lg text-gray-700">
|
||||
<strong>Telefon:</strong> {benutzer.telefon}
|
||||
</p>
|
||||
<p class="text-lg text-gray-700">
|
||||
<strong>E-Mail:</strong> {benutzer.email}
|
||||
</p>
|
||||
<p class="text-lg text-gray-700">
|
||||
<strong>Erstelldatum:</strong> {moment(ausweis.created_at).format("DD.MM.YYYY")}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Fußzeile: Navigation (1/3) -->
|
||||
<div class="border-t pt-4 flex justify-between items-center">
|
||||
<button class="bg-gray-300 text-gray-700 px-2 py-1 rounded hover:bg-gray-400">
|
||||
«
|
||||
</button>
|
||||
<p class="text-gray-700 font-medium">
|
||||
Ausweis 1/3
|
||||
</p>
|
||||
<button class="bg-gray-300 text-gray-700 px-2 py-1 rounded hover:bg-gray-400">
|
||||
»
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<dialog bind:this={hilfeModal} class="modal">
|
||||
<div class="modal-box">
|
||||
<h3 class="font-bold text-xl mb-4">Hilfe Anfordern</h3>
|
||||
|
||||
@@ -47,19 +47,6 @@
|
||||
<div class="text-sm text-center">Energieausweis</div>
|
||||
</a>
|
||||
{/if}
|
||||
{#if objekt.aufnahmen.at(-1)?.bedarfsausweise_wohnen.length}
|
||||
{@const ausweis = objekt.aufnahmen.at(-1)?.bedarfsausweise_wohnen.at(-1)}
|
||||
<a href="/pdf/ansichtsausweis?id={ausweis.id}" target="_blank">
|
||||
<div class="inline-block border rounded-lg bg-white">
|
||||
{#if ausweis?.ausgestellt}
|
||||
<img src="/images/dashboard/AusweisHaken.svg" class="h-auto w-auto max-h-[150px] max-w-full object-contain p-1" alt="Energieausweis ausgestellt">
|
||||
{:else}
|
||||
<img src="/images/dashboard/AusweisKreuz.svg" class="h-auto w-auto max-h-[150px] max-w-full object-contain p-1" alt="Energieausweis ausgestellt">
|
||||
{/if}
|
||||
</div>
|
||||
<div class="text-sm text-center">Energieausweis</div>
|
||||
</a>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="flex flex-col gap-4">
|
||||
{#each objekt.aufnahmen as aufnahme}
|
||||
|
||||
@@ -1,113 +1,89 @@
|
||||
<script lang="ts">
|
||||
import { ripple } from "svelte-ripple-action";
|
||||
import type { RippleOptions } from "svelte-ripple-action/dist/constants.js";
|
||||
import { Reader, Bell, Gear, LockClosed, CaretDown } from "radix-svelte-icons"
|
||||
import {
|
||||
Reader,
|
||||
Bell,
|
||||
Gear,
|
||||
LockClosed,
|
||||
CaretDown,
|
||||
} from "radix-svelte-icons";
|
||||
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
||||
import DashboardNotification from "./DashboardNotification.svelte";
|
||||
import { notifications } from "#components/NotificationProvider/shared.js";
|
||||
import ThemeController from "#components/ThemeController.svelte";
|
||||
import { BenutzerClient, ObjektKomplettClient } from "#components/Ausweis/types.js";
|
||||
import {
|
||||
BenutzerClient,
|
||||
ObjektKomplettClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
|
||||
export let lightTheme: boolean;
|
||||
export let benutzer: BenutzerClient;
|
||||
|
||||
const rippleOptions: RippleOptions = {
|
||||
center: false,
|
||||
color: lightTheme ? "rgba(233,233,233,0.1)" : "rgba(113, 128, 150, 0.1)",
|
||||
};
|
||||
|
||||
let headerOpen = false;
|
||||
</script>
|
||||
|
||||
<aside class:hidden={!headerOpen} class="fixed left-0 top-16 w-full h-[calc(100%-4rem)] flex md:relative md:h-auto md:w-auto md:top-0 md:flex bg-base-200 border-r border-r-base-300 flex-col py-4">
|
||||
|
||||
<div class="flex flex-row items-center px-4">
|
||||
|
||||
<aside class="rounded-lg bg-white box px-6 py-5">
|
||||
<div class="flex flex-row items-center">
|
||||
<div class="flex flex-row mr-6">
|
||||
<a href="/"><img src="/images/header/logo-IBC-big.svg" class="h-16" alt="IBCornelsen - Logo"/></a>
|
||||
<a href="/"
|
||||
><img
|
||||
src="/images/header/logo-IBC-big.svg"
|
||||
class="h-16"
|
||||
alt="IBCornelsen - Logo"
|
||||
/></a
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="flex-col items-end">
|
||||
<div class="text-base-content font-semibold text-left flex"
|
||||
>{benutzer.vorname} {benutzer.name}</div>
|
||||
<div class="text-base-content font-semibold text-left flex">
|
||||
{benutzer.vorname}
|
||||
{benutzer.name}
|
||||
</div>
|
||||
<div class="text-base-content text-sm flex">{benutzer.email}</div>
|
||||
<a href="/auth/logout" class="text-xs">Logout</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard">
|
||||
<a class="button-tab" href="/dashboard">
|
||||
<Reader width={22} height={22} />
|
||||
Vorgänge
|
||||
</a>
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard">
|
||||
<a class="button-tab" href="/dashboard">
|
||||
<Reader width={22} height={22} />
|
||||
Inbox
|
||||
</a>
|
||||
|
||||
<hr class="border-gray-600">
|
||||
|
||||
<!--
|
||||
<div class="text-base-content text-xl px-4 mt-4">Mitwirkende</div>
|
||||
<div class="flex flex-col gap-4 px-4">
|
||||
{#each [
|
||||
{ name: "Max Mustermann", image: "/images/profile-placeholder.svg", profession: "Architekt" },
|
||||
{ name: "Erika Musterfrau", image: "/images/profile-placeholder.svg", profession: "Ingenieurin" },
|
||||
{ name: "Hans Beispiel", image: "/images/profile-placeholder.svg", profession: "Energieberater" },
|
||||
{ name: "Anna Beispiel", image: "/images/profile-placeholder.svg", profession: "Bauleiterin" }
|
||||
] as person}
|
||||
<div class="flex items-center gap-4">
|
||||
<img src={person.image} alt={person.name} class="w-12 h-12 rounded-full object-cover" />
|
||||
<div class="flex flex-col">
|
||||
<span class="text-base-content font-medium">{person.name}</span>
|
||||
<span class="text-sm text-gray-500">{person.profession}</span>
|
||||
</div>
|
||||
<button class="ml-auto btn btn-primary btn-sm">Chat</button>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
-->
|
||||
|
||||
<!-- <button use:ripple={rippleOptions} class="button-tab">
|
||||
<EnvelopeClosed width={22} height={22} />
|
||||
Kontakt
|
||||
</button>
|
||||
<li><details class="[&_.caret]:open:rotate-180">
|
||||
<summary class="button-tab w-full outline-0 hover:outline-0">
|
||||
<Cube width={22} height={22} />
|
||||
Services <CaretDown size={24} class="caret ml-auto transition-transform"></CaretDown></summary>
|
||||
<ul>
|
||||
<li>
|
||||
<button use:ripple={rippleOptions} class="button-tab">
|
||||
Kontakt
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
<button use:ripple={rippleOptions} class="button-tab">
|
||||
Kontakt
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</details></li> -->
|
||||
<hr class="border-gray-600" />
|
||||
{#if benutzer.rolle === "ADMIN"}
|
||||
<li><details class="[&_.caret]:open:rotate-180" open>
|
||||
<summary class="button-tab w-full outline-0 hover:outline-0 cursor-pointer">
|
||||
<li>
|
||||
<details class="[&_.caret]:open:rotate-180" open>
|
||||
<summary
|
||||
class="button-tab w-full outline-0 hover:outline-0 cursor-pointer"
|
||||
>
|
||||
<LockClosed width={22} height={22} />
|
||||
Admin <CaretDown size={24} class="caret ml-auto transition-transform"></CaretDown></summary>
|
||||
Admin <CaretDown
|
||||
size={24}
|
||||
class="caret ml-auto transition-transform"
|
||||
></CaretDown></summary
|
||||
>
|
||||
<ul>
|
||||
<li>
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/ausweise-pruefen">
|
||||
<a
|
||||
class="button-tab"
|
||||
href="/dashboard/admin/ausweise-pruefen"
|
||||
>
|
||||
Ausweise Prüfen
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/impersonate-user">
|
||||
<a
|
||||
class="button-tab"
|
||||
href="/dashboard/admin/impersonate-user"
|
||||
>
|
||||
Impersonate User
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</details></li>
|
||||
</details>
|
||||
</li>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="mt-10 flex flex-col gap-4 px-8">
|
||||
@@ -116,18 +92,26 @@
|
||||
<div class="dropdown dropdown-top">
|
||||
<div class="indicator">
|
||||
{#if Object.keys($notifications).length > 0}
|
||||
<span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
|
||||
<span class="indicator-item badge badge-accent text-xs"
|
||||
>{Object.keys($notifications).length}</span
|
||||
>
|
||||
{/if}
|
||||
<button tabindex="0" class="hover:bg-gray-200 p-3 rounded-lg">
|
||||
<button
|
||||
tabindex="0"
|
||||
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||
>
|
||||
<Bell size={24} />
|
||||
</button>
|
||||
</div>
|
||||
<ul class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80">
|
||||
<ul
|
||||
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
|
||||
>
|
||||
<NotificationProvider component={DashboardNotification} />
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<a href="/dashboard/einstellungen"
|
||||
<a
|
||||
href="/dashboard/einstellungen"
|
||||
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||
>
|
||||
<Gear size={24} />
|
||||
@@ -137,10 +121,8 @@
|
||||
<div class="divider px-8"></div>
|
||||
<a
|
||||
href="/dashboard/einstellungen"
|
||||
use:ripple={rippleOptions}
|
||||
class="hover:bg-gray-200 no-animation focus:shadow-none justify-start py-4 h-auto px-8 rounded-none w-full flex flex-row gap-4"
|
||||
>
|
||||
|
||||
</a>
|
||||
</aside>
|
||||
|
||||
|
||||
@@ -28,6 +28,12 @@ export function updateNotification(uid: string, updater: Partial<Notification>)
|
||||
value[uid] = { ...defaults, ...value[uid], ...updater } as Notification;
|
||||
return value;
|
||||
})
|
||||
|
||||
if (updater.timeout) {
|
||||
setTimeout(() => {
|
||||
deleteNotification(uid);
|
||||
}, updater.timeout);
|
||||
}
|
||||
}
|
||||
|
||||
export function addNotification(notification: Partial<Notification>): string {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const BedarfsausweisGewerbeSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -20,6 +20,7 @@ export const BedarfsausweisGewerbeSchema = z.object({
|
||||
bauteilaktivierung: z.boolean().nullish(),
|
||||
klimatisierung: z.boolean().nullish(),
|
||||
nachweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const BedarfsausweisWohnenSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -86,6 +86,7 @@ export const BedarfsausweisWohnenSchema = z.object({
|
||||
pruefpunkt_geometrie: z.boolean().nullish(),
|
||||
pruefpunkt_fenster: z.boolean().nullish(),
|
||||
ausweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
rechnung_id: z.string().nullish(),
|
||||
aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"),
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const GEGNachweisGewerbeSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -10,6 +10,7 @@ export const GEGNachweisGewerbeSchema = z.object({
|
||||
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
|
||||
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
|
||||
nachweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const GEGNachweisWohnenSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -10,6 +10,7 @@ export const GEGNachweisWohnenSchema = z.object({
|
||||
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
|
||||
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
|
||||
nachweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const VerbrauchsausweisGewerbeSchema = z.object({
|
||||
id: z.string(),
|
||||
@@ -52,6 +52,7 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
ausweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
pruefpunkt_heizungsalter: z.boolean().nullish(),
|
||||
pruefpunkt_verbrauch_niedrig: z.boolean().nullish(),
|
||||
pruefpunkt_verbrauch_hoch: z.boolean().nullish(),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as z from "zod"
|
||||
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
|
||||
import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
|
||||
|
||||
export const VerbrauchsausweisWohnenSchema = z.object({
|
||||
id: z.string().describe("ID des Ausweises"),
|
||||
@@ -38,6 +38,7 @@ export const VerbrauchsausweisWohnenSchema = z.object({
|
||||
beschreibung: z.string().nullish(),
|
||||
kontrolldatei_angefragt: z.boolean().describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde").nullish(),
|
||||
ausweistyp: z.nativeEnum(AusweisTyp),
|
||||
ausweisart: z.nativeEnum(Ausweisart),
|
||||
created_at: z.date(),
|
||||
updated_at: z.date(),
|
||||
pruefpunkt_heizungsalter: z.boolean().nullish(),
|
||||
|
||||
@@ -3,22 +3,19 @@
|
||||
import "../style/global.css";
|
||||
import "../../svelte-dialogs.config.js";
|
||||
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
import { BenutzerClient, ObjektClient } from "#components/Ausweis/types";
|
||||
|
||||
const valid = validateAccessTokenServer(Astro)
|
||||
|
||||
if (!valid) {
|
||||
Astro.redirect("/auth/login", 302)
|
||||
}
|
||||
import { BenutzerClient } from "#components/Ausweis/types";
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
user: BenutzerClient
|
||||
user: BenutzerClient;
|
||||
}
|
||||
|
||||
const { title, user } = Astro.props;
|
||||
|
||||
if (!user) {
|
||||
Astro.redirect("/auth/login", 302);
|
||||
}
|
||||
|
||||
const schema = JSON.stringify({
|
||||
"@context": "http://schema.org",
|
||||
"@type": "Corporation",
|
||||
@@ -53,22 +50,22 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
if (import.meta.env.PROD) {
|
||||
H.init("1jdkoe52", {
|
||||
serviceName: "online-energieausweis",
|
||||
backendUrl: "https://highlight-backend.online-energieausweis.org/public",
|
||||
backendUrl:
|
||||
"https://highlight-backend.online-energieausweis.org/public",
|
||||
tracingOrigins: true,
|
||||
networkRecording: {
|
||||
enabled: true,
|
||||
recordHeadersAndBody: true
|
||||
}
|
||||
})
|
||||
recordHeadersAndBody: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<script type="application/ld+json" set:html={schema}></script>
|
||||
<script type="application/ld+json" set:html={schema} />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
|
||||
|
||||
<meta
|
||||
@@ -112,7 +109,6 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<main
|
||||
class="p-0 grid max-w-[1920px]
|
||||
xs:grid-cols-[minmax(1fr,1fr)] xs:gap-1 xs:p-0
|
||||
@@ -122,13 +118,15 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
xl:grid-cols-[minmax(150px,350px)1fr] xl:gap-4 xl:p-6
|
||||
2xl:grid-cols-[minmax(150px,300px)1fr] 2xl:gap-5 2xl:p-6"
|
||||
>
|
||||
<DashboardSidebar
|
||||
lightTheme={lightTheme}
|
||||
benutzer={user}
|
||||
client:load
|
||||
/>
|
||||
|
||||
<DashboardSidebar lightTheme={lightTheme} benutzer={user} client:load>
|
||||
</DashboardSidebar>
|
||||
|
||||
<article class="box px-6 py-5 h-screen">
|
||||
<slot />
|
||||
|
||||
</article>
|
||||
</main>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -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,43 +60,13 @@ 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<ReturnType<typeof getKlimafaktoren>> = [{
|
||||
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 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 }, brennstoff_2 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 };
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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<ReturnType<typeof getKlimafaktoren>> = [{
|
||||
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(
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
@@ -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<number> {
|
||||
const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt);
|
||||
|
||||
if (!result) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return result.endEnergieVerbrauchGesamt;
|
||||
}
|
||||
@@ -18,8 +18,6 @@ export const getKlimafaktoren = memoize(async (date: Date, plz: string) => {
|
||||
});
|
||||
return response;
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q"
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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
|
||||
@@ -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,9 +687,15 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
||||
}
|
||||
|
||||
|
||||
for (const page of pages) {
|
||||
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 || "")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -591,9 +592,15 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
||||
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
|
||||
}
|
||||
|
||||
for (const page of pages) {
|
||||
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();
|
||||
|
||||
Binary file not shown.
@@ -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,
|
||||
});
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -8,6 +8,28 @@ export async function getVerbrauchsausweisWohnen(id: string): Promise<Verbrauchs
|
||||
})
|
||||
}
|
||||
|
||||
export async function getVerbrauchsausweisWohnenKomplett(id: string) {
|
||||
return await prisma.verbrauchsausweisWohnen.findUnique({
|
||||
where: {
|
||||
id
|
||||
},
|
||||
include: {
|
||||
aufnahme: {
|
||||
include: {
|
||||
bilder: true,
|
||||
objekt: {
|
||||
include: {
|
||||
benutzer: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export type VerbrauchsausweisWohnenKomplett = Awaited<ReturnType<typeof getVerbrauchsausweisWohnenKomplett>>;
|
||||
|
||||
export async function getVerbrauchsausweisGewerbe(id: string): Promise<VerbrauchsausweisGewerbe | null> {
|
||||
return await prisma.verbrauchsausweisGewerbe.findUnique({
|
||||
where: {
|
||||
@@ -16,6 +38,26 @@ export async function getVerbrauchsausweisGewerbe(id: string): Promise<Verbrauch
|
||||
})
|
||||
}
|
||||
|
||||
export async function getVerbrauchsausweisGewerbeKomplett(id: string) {
|
||||
return await prisma.verbrauchsausweisGewerbe.findUnique({
|
||||
where: {
|
||||
id
|
||||
},
|
||||
include: {
|
||||
aufnahme: {
|
||||
include: {
|
||||
bilder: true,
|
||||
objekt: {
|
||||
include: {
|
||||
benutzer: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export async function getBedarfsausweisWohnen(id: string): Promise<BedarfsausweisWohnen | null> {
|
||||
return await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
@@ -24,6 +66,26 @@ export async function getBedarfsausweisWohnen(id: string): Promise<Bedarfsauswei
|
||||
})
|
||||
}
|
||||
|
||||
export async function getBedarfsausweisWohnenKomplett(id: string) {
|
||||
return await prisma.bedarfsausweisWohnen.findUnique({
|
||||
where: {
|
||||
id
|
||||
},
|
||||
include: {
|
||||
aufnahme: {
|
||||
include: {
|
||||
bilder: true,
|
||||
objekt: {
|
||||
include: {
|
||||
benutzer: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export async function getBedarfsausweisGewerbe(id: string): Promise<BedarfsausweisGewerbe | null> {
|
||||
return await prisma.bedarfsausweisGewerbe.findUnique({
|
||||
where: {
|
||||
|
||||
282
src/lib/server/invoice.ts
Normal file
282
src/lib/server/invoice.ts
Normal file
@@ -0,0 +1,282 @@
|
||||
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<typeof createLineItem>;
|
||||
|
||||
export function addedServicesNeu(
|
||||
data: any,
|
||||
rechnung: Rechnung,
|
||||
steuer: number
|
||||
) {
|
||||
if (rechnung.services.includes(Enums.Service.Qualitaetsdruck)) {
|
||||
data["lineItems"].push(
|
||||
createLineItem("Zusatzservice Postversand", 9, steuer)
|
||||
);
|
||||
}
|
||||
if (rechnung.services.includes(Enums.Service.Aushang)) {
|
||||
data["lineItems"].push(
|
||||
createLineItem("Zusatzservice Aushang", 10, steuer)
|
||||
);
|
||||
}
|
||||
if (rechnung.services.includes(Enums.Service.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, string> = {
|
||||
[Enums.Bezahlmethoden.paypal]: "PayPal",
|
||||
[Enums.Bezahlmethoden.creditcard]: "Kreditkarte",
|
||||
[Enums.Bezahlmethoden.sofort]: "Sofortüberweisung",
|
||||
[Enums.Bezahlmethoden.giropay]: "Giropay",
|
||||
[Enums.Bezahlmethoden.rechnung]: "Rechnung",
|
||||
};
|
||||
|
||||
const type = types[rechnung.bezahlmethode];
|
||||
|
||||
data[
|
||||
"introduction"
|
||||
] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`;
|
||||
}
|
||||
|
||||
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"],
|
||||
};
|
||||
}
|
||||
47
src/lib/server/klimafaktoren.ts
Normal file
47
src/lib/server/klimafaktoren.ts
Normal file
@@ -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,
|
||||
}));
|
||||
}
|
||||
@@ -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 = "<br>";
|
||||
$anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"];
|
||||
// // carriage return type (RFC)
|
||||
// $eol = "<br>";
|
||||
// $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) {
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
|
||||
import Carousel from "#components/Carousel.svelte";
|
||||
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
||||
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.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";
|
||||
@@ -25,7 +26,7 @@
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="relative mb-6 hidden">
|
||||
<div class="relative mb-6">
|
||||
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center" on:click={toggleDropdown}>
|
||||
Ausweis erstellen +
|
||||
</button>
|
||||
@@ -46,7 +47,7 @@
|
||||
{#if aufnahme.bilder.length > 0}
|
||||
<Carousel perPage={3}>
|
||||
{#each aufnahme.bilder as bild, i (i)}
|
||||
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[15vh] h-full w-full object-contain">
|
||||
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[25vh] h-full w-full object-contain">
|
||||
{/each}
|
||||
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
|
||||
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
|
||||
@@ -73,7 +74,7 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="my-4 grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1">
|
||||
<div class="my-4 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
|
||||
{#each aufnahme.verbrauchsausweise_wohnen as ausweis}
|
||||
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
|
||||
{/each}
|
||||
@@ -95,5 +96,5 @@
|
||||
</div>
|
||||
|
||||
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
|
||||
<NotificationProvider component={AusweisPruefenNotification}></NotificationProvider>
|
||||
<NotificationWrapper></NotificationWrapper>
|
||||
</div>
|
||||
@@ -1,83 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||
import DashboardAusweisSkeleton from "#components/Dashboard/DashboardAusweisSkeleton.svelte";
|
||||
import { verbrauchsausweisWohnenCalculateFormProgress } from "#lib/VerbrauchsausweisWohnen/calculateFormProgress";
|
||||
import { onMount } from "svelte";
|
||||
export let user: BenutzerClient;
|
||||
|
||||
let ausweise: VerbrauchsausweisWohnenClient[] | null = null;
|
||||
|
||||
let ausweisUeberpruefung: ReturnType<typeof verbrauchsausweisWohnenCalculateFormProgress>[] = [];
|
||||
let errorCount = 0;
|
||||
|
||||
onMount(async () => {
|
||||
ausweise = await client.v1.verbrauchsausweisWohnen.getMany.query({
|
||||
limit: 10
|
||||
});
|
||||
|
||||
console.log(ausweise);
|
||||
|
||||
|
||||
if (!ausweise) return;
|
||||
|
||||
ausweisUeberpruefung = ausweise.map(ausweis => verbrauchsausweisWohnenCalculateFormProgress(ausweis));
|
||||
|
||||
errorCount = ausweisUeberpruefung.reduce((acc, { errors }) => acc + errors.length, 0);
|
||||
})
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
{#if errorCount > 0}
|
||||
<h1 class="text-4xl font-medium my-8">Wichtiges</h1>
|
||||
|
||||
<div class="flex flex-row gap-4 overflow-x-auto">
|
||||
{#each ausweisUeberpruefung as { errors }}
|
||||
{#if errors.length > 0}
|
||||
<div class="card w-96 card-bordered bg-base-200 border-base-300">
|
||||
<div class="card-body">
|
||||
<div class="badge font-semibold" class:badge-warning={errors[0].severity == "warning"} class:badge-error={errors[0].severity == "error"}>{errors[0].severity == "error" ? "Achtung!" : "Wichtig!"}</div>
|
||||
<h2 class="card-title">{errors[0].title}</h2>
|
||||
<p>{errors[0].description}</p>
|
||||
{#if errors[0].resolvehref}
|
||||
<div class="card-actions justify-end">
|
||||
<a class="btn btn-primary" href={errors[0].resolvehref}>Beheben</a>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<h1 class="text-4xl font-medium my-8">Ihre Ausweise</h1>
|
||||
|
||||
<div class="grid xl:grid-cols-2 grid-cols-1 gap-4">
|
||||
|
||||
{#if ausweise === null}
|
||||
<DashboardAusweisSkeleton></DashboardAusweisSkeleton>
|
||||
{:else}
|
||||
{#if ausweise.length == 0}
|
||||
<div class="">
|
||||
<h1 class="text-2xl">Es konnten keine Ausweise gefunden werden.</h1>
|
||||
<p>Erstellen sie einen Verbrauchsausweis für ihr Wohngebäude <a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude">hier</a></p>
|
||||
</div>
|
||||
{:else}
|
||||
{#each ausweise as ausweis, i}
|
||||
<DashboardAusweis progress={ausweisUeberpruefung[i]?.progress || 0} {ausweis}></DashboardAusweis>
|
||||
{/each}
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-center mt-12">
|
||||
<div class="join">
|
||||
<button class="join-item btn btn-ghost shadow-none">1</button>
|
||||
<button class="join-item btn btn-ghost shadow-none">2</button>
|
||||
<button class="join-item btn btn-ghost shadow-none">3</button>
|
||||
<button class="join-item btn btn-ghost shadow-none">4</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -4,26 +4,132 @@
|
||||
BenutzerClient,
|
||||
ObjektKomplettClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
import DashboardObjekt from "#components/Dashboard/DashboardObjekt.svelte";
|
||||
import Overlay from "#components/Overlay.svelte";
|
||||
import PlzSuche from "#components/PlzSuche.svelte";
|
||||
import { api } from "astro-typesafe-api/client";
|
||||
import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
|
||||
import { Enums } from "#lib/client/prisma.js";
|
||||
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||
import { addNotification } from "#components/Notifications/shared.js";
|
||||
import Cookies from "js-cookie";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import Pagination from "#components/Pagination.svelte";
|
||||
import { Enums, Objekt } from "#lib/client/prisma.js";
|
||||
|
||||
export let user: BenutzerClient;
|
||||
export let objekt: ObjektKomplettClient;
|
||||
export let objekte: ObjektKomplettClient[];
|
||||
export let page: number;
|
||||
export let totalPages: number;
|
||||
|
||||
let objektOverlayHidden = true;
|
||||
|
||||
let objekt: Objekt = {
|
||||
adresse: "",
|
||||
erstellungsdatum: new Date(),
|
||||
latitude: 0,
|
||||
longitude: 0,
|
||||
ort: "",
|
||||
plz: ""
|
||||
};
|
||||
|
||||
async function objektErstellen() {
|
||||
if (!objekt.adresse || !objekt.ort || !objekt.plz) {
|
||||
addNotification({
|
||||
message: "Daten unvollständig.",
|
||||
subtext: "Ihre eingegebenen Daten sind unvollständig, bitte vervollständigen sie diese und versuchen sie es erneut..",
|
||||
timeout: 3000,
|
||||
dismissable: true,
|
||||
type: "error"
|
||||
})
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await api.objekt.PUT.fetch({
|
||||
adresse: objekt.adresse,
|
||||
latitude: 0,
|
||||
longitude: 0,
|
||||
ort: objekt.ort,
|
||||
plz: objekt.plz
|
||||
}, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||
}
|
||||
})
|
||||
|
||||
if (!result) {
|
||||
addNotification({
|
||||
message: "Etwas ist schiefgelaufen.",
|
||||
subtext: "Das Objekt konnte nicht erstellt werden.",
|
||||
timeout: 3000,
|
||||
dismissable: true,
|
||||
type: "error"
|
||||
})
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
objektOverlayHidden = true;
|
||||
|
||||
objekte.push({
|
||||
...objekt,
|
||||
aufnahmen: [],
|
||||
id: result.id
|
||||
})
|
||||
|
||||
objekt = {
|
||||
adresse: "",
|
||||
erstellungsdatum: new Date(),
|
||||
latitude: 0,
|
||||
longitude: 0,
|
||||
ort: "",
|
||||
plz: ""
|
||||
}
|
||||
|
||||
objekte = objekte
|
||||
}
|
||||
export let id: string = "";
|
||||
</script>
|
||||
|
||||
<h1>Ihre aktuellen Vorgänge</h1>
|
||||
|
||||
<hr />
|
||||
|
||||
{#if user.rolle === Enums.BenutzerRolle.ADMIN}
|
||||
<!-- <div class="flex flex-col mb-4">
|
||||
<AusweisePruefenFilter bind:filters={filters}></AusweisePruefenFilter>
|
||||
</div> -->
|
||||
<form action="" class="flex flex-row gap-2 my-2">
|
||||
<input type="text" bind:value={id} name="id" placeholder="ID">
|
||||
<button class="button text-sm">Suchen</button>
|
||||
</form>
|
||||
{/if}
|
||||
|
||||
<!-- <div class="relative mb-6">
|
||||
<button class="button" on:click={() => {
|
||||
objektOverlayHidden = false
|
||||
}}> Gebäude anlegen + </button>
|
||||
</div> -->
|
||||
|
||||
<DashboardAusweis objekt={objekt} ausweis={objekt.aufnahmen[0].verbrauchsausweise_wohnen[0]} aufnahme={objekt.aufnahmen[0]} rechnung={objekt.aufnahmen[0].verbrauchsausweise_wohnen[0].rechnung} benutzer={user}></DashboardAusweis>
|
||||
<div class="grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1 gap-4">
|
||||
{#each objekte as objekt}
|
||||
<DashboardObjekt {objekt}></DashboardObjekt>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<Pagination pages={totalPages} current={page} prev="/dashboard/objekte/{page - 1}" next="/dashboard/objekte/{page + 1}"></Pagination>
|
||||
|
||||
|
||||
<Overlay bind:hidden={objektOverlayHidden}>
|
||||
<div class="bg-white w-full max-w-screen-sm px-4 py-6 flex flex-col gap-4">
|
||||
<h2 class="p-0 m-0">Gebäude erstellen</h2>
|
||||
|
||||
<input type="text" placeholder="Adresse" bind:value={objekt.adresse}>
|
||||
<div class="flex flex-row gap-4 justify-between">
|
||||
<PlzSuche bind:city={objekt.ort} bind:zip={objekt.plz} name="" placeholder="PLZ"></PlzSuche>
|
||||
<input type="text" bind:value={objekt.ort} placeholder="Ort">
|
||||
</div>
|
||||
<button class="button mt-4" on:click={objektErstellen}>Gebäude Erstellen</button>
|
||||
</div>
|
||||
</Overlay>
|
||||
|
||||
<NotificationWrapper></NotificationWrapper>
|
||||
@@ -27,7 +27,7 @@
|
||||
<span>{user.vorname} {user.name}</span>
|
||||
<span class="text-xs">{user.email}</span>
|
||||
</div>
|
||||
<a href="/dashboard/admin/impersonate?uid={user.uid}" class="button text-sm">Einloggen</a>
|
||||
<a href="/dashboard/admin/impersonate?id={user.id}" class="button text-sm">Einloggen</a>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
import { getMaximumDevitationInPercent } from "#client/lib/helpers.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
|
||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
|
||||
|
||||
export let user: Partial<BenutzerClient>;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
|
||||
@@ -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<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | 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"
|
||||
<h3>Bitte untenstehende Punkte bestätigen. Bitte gehen Sie gegebenenfalls zurück zum Formular und überprüfen bzw. korrigieren Ihre Eingaben.</h3>
|
||||
|
||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||
{@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt)}
|
||||
{@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt)}
|
||||
|
||||
{#await request}
|
||||
|
||||
|
||||
@@ -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}
|
||||
>
|
||||
</ButtonWeiterHilfe>
|
||||
@@ -244,6 +246,7 @@
|
||||
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||
showWeiter={true}
|
||||
{form}
|
||||
{partner_code}
|
||||
{skala}
|
||||
>
|
||||
</ButtonWeiterHilfe>
|
||||
|
||||
@@ -230,7 +230,3 @@
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -160,6 +160,7 @@ let skala: HTMLDivElement;
|
||||
bind:aufnahme
|
||||
ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||
showWeiter={false}
|
||||
{partner_code}
|
||||
{form}
|
||||
{skala}
|
||||
>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
})
|
||||
|
||||
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
|
||||
}
|
||||
})
|
||||
|
||||
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 (!ausweis) {
|
||||
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 UID weiter.
|
||||
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
|
||||
);
|
||||
}
|
||||
} catch(e) {
|
||||
|
||||
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
|
||||
|
||||
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"
|
||||
);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
---
|
||||
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen" tabHover3="glow">
|
||||
<BedarfsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} {id}></BedarfsausweisWohnenModule>
|
||||
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
|
||||
<BedarfsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} {id} {user} loadFromDatabase={id !== null} {partner_code}></BedarfsausweisWohnenModule>
|
||||
</AusweisLayout>
|
||||
@@ -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
|
||||
|
||||
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||
},
|
||||
params: {
|
||||
uid: uid_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
|
||||
}
|
||||
})
|
||||
|
||||
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
|
||||
}
|
||||
})
|
||||
|
||||
if (!ausweis) {
|
||||
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 UID weiter.
|
||||
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
|
||||
);
|
||||
}
|
||||
} catch(e) {
|
||||
|
||||
aufnahme = await getAufnahme(ausweis.aufnahme_id) as 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-gewerbe"
|
||||
);
|
||||
}
|
||||
|
||||
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-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) {
|
||||
}
|
||||
---
|
||||
|
||||
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen" tabHover2="glow">
|
||||
<VerbrauchsausweisGewerbeModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp}/>
|
||||
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen">
|
||||
<VerbrauchsausweisGewerbeModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} {user} {id} {partner_code} loadFromDatabase={id !== null}/>
|
||||
</AusweisLayout>
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
})
|
||||
|
||||
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
|
||||
}
|
||||
})
|
||||
|
||||
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 (!ausweis) {
|
||||
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 UID weiter.
|
||||
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
|
||||
return Astro.redirect(
|
||||
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
|
||||
);
|
||||
}
|
||||
} catch(e) {
|
||||
|
||||
aufnahme = await getAufnahme(ausweis.aufnahme_id) as 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"
|
||||
);
|
||||
}
|
||||
|
||||
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) {
|
||||
---
|
||||
|
||||
<AusweisLayout title="Verbrauchsausweis erstellen" tabHover1="glow">
|
||||
<VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} />
|
||||
<VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {id} {ausweistyp} {user} {partner_code} loadFromDatabase={id !== null} />
|
||||
</AusweisLayout>
|
||||
|
||||
@@ -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 } 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({
|
||||
@@ -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) {
|
||||
@@ -125,34 +84,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,
|
||||
@@ -170,18 +129,18 @@ export const GET = defineApiRoute({
|
||||
ACL: "private",
|
||||
});
|
||||
|
||||
const response = await s3Client.send(command);
|
||||
await s3Client.send(command);
|
||||
}
|
||||
|
||||
if (pdfDatenblatt) {
|
||||
const command = new PutObjectCommand({
|
||||
Bucket: "ibc-pdfs",
|
||||
Key: `ID_${ausweis.id}_Energieausweis.pdf`,
|
||||
Key: `ID_${ausweis.id}_Datenblatt.pdf`,
|
||||
Body: pdfDatenblatt,
|
||||
ACL: "private",
|
||||
});
|
||||
|
||||
const response = await s3Client.send(command);
|
||||
await s3Client.send(command);
|
||||
}
|
||||
|
||||
let text: string;
|
||||
@@ -273,5 +232,34 @@ fax 040 · 209339859
|
||||
subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`,
|
||||
text,
|
||||
});
|
||||
|
||||
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,
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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 = `<Datenregistratur xmlns="http://energieausweis.dibt.de/WebServiceEnergie/DibtEnergieAusweisService">
|
||||
<doc>
|
||||
<root>
|
||||
<Authentifizierung>
|
||||
<Aussteller_ID_DIBT>${Aussteller_ID_DIBT}</Aussteller_ID_DIBT>
|
||||
<Aussteller_PWD_DIBT>${Aussteller_PWD_DIBT}</Aussteller_PWD_DIBT>
|
||||
</Authentifizierung>
|
||||
<EnEV-Nachweis>
|
||||
<Ausstellungsdatum>${Ausstellungsdatum}</Ausstellungsdatum>
|
||||
<Bundesland>${postleitzahl.bundesland}</Bundesland>
|
||||
<Postleitzahl>${postleitzahl.plz}</Postleitzahl>
|
||||
<Gesetzesgrundlage>${Gesetzesgrundlage}</Gesetzesgrundlage>
|
||||
</EnEV-Nachweis>
|
||||
<Energieausweis-Daten>
|
||||
<Gebaeudeart>${gebaeudeart}</Gebaeudeart>
|
||||
<Art>${art}</Art>
|
||||
<Neubau>${
|
||||
ausweis.ausstellgrund ===
|
||||
Enums.Ausstellgrund.Neubau
|
||||
? "1"
|
||||
: "0"
|
||||
}</Neubau>
|
||||
</Energieausweis-Daten>
|
||||
</root>
|
||||
</doc>
|
||||
</Datenregistratur>`;
|
||||
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:
|
||||
|
||||
@@ -2,7 +2,7 @@ import { z } from "zod";
|
||||
import moment from "moment";
|
||||
import { prisma } from "#lib/server/prisma.js";
|
||||
import { encodeToken } from "../../../lib/auth/token.js";
|
||||
import { hashPassword, validatePassword } from "../../../lib/password.js";
|
||||
import { validatePassword } from "../../../lib/password.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { TokenType } from "#lib/auth/types.js";
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||
import { generatePrefixedId } from "#lib/db.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||
import { generatePrefixedId } from "#lib/db.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { BedarfsausweisWohnen, prisma } from "#lib/server/prisma.js";
|
||||
import { prisma } from "#lib/server/prisma.js";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
|
||||
import { z } from "zod";
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
zurueckgestellt: true,
|
||||
created_at: true,
|
||||
updated_at: true,
|
||||
storniert: true
|
||||
storniert: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -29,6 +29,7 @@ export const PUT = defineApiRoute({
|
||||
created_at: true,
|
||||
updated_at: true,
|
||||
storniert: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix,
|
||||
}),
|
||||
@@ -51,7 +52,7 @@ export const PUT = defineApiRoute({
|
||||
}
|
||||
|
||||
const id = generatePrefixedId(
|
||||
6,
|
||||
9,
|
||||
VALID_UUID_PREFIXES.BedarfsausweisWohnen
|
||||
);
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||
import { generatePrefixedId } from "#lib/db.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
output: z.void(),
|
||||
headers: {
|
||||
|
||||
@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
|
||||
rechnung_id: true,
|
||||
storniert: true,
|
||||
updated_at: true,
|
||||
zurueckgestellt: true
|
||||
zurueckgestellt: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -52,9 +52,6 @@ export const PUT = defineApiRoute({
|
||||
})
|
||||
}
|
||||
|
||||
console.log(nachweis);
|
||||
|
||||
|
||||
if (!nachweis || nachweis.benutzer_id !== user.id) {
|
||||
throw new APIError({
|
||||
code: "BAD_REQUEST",
|
||||
|
||||
@@ -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}`
|
||||
});
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -14,7 +14,8 @@ export const PATCH = defineApiRoute({
|
||||
benutzer_id: true,
|
||||
aufnahme_id: true,
|
||||
updated_at: true,
|
||||
created_at: true
|
||||
created_at: true,
|
||||
ausweisart: true
|
||||
}).merge(z.object({
|
||||
startdatum: z.coerce.date().nullable(),
|
||||
})),
|
||||
|
||||
@@ -21,7 +21,8 @@ export const PUT = defineApiRoute({
|
||||
aufnahme_id: true,
|
||||
rechnung_id: true,
|
||||
updated_at: true,
|
||||
created_at: true
|
||||
created_at: true,
|
||||
ausweisart: true
|
||||
}).merge(z.object({
|
||||
startdatum: z.coerce.date().nullable()
|
||||
})),
|
||||
|
||||
@@ -15,7 +15,8 @@ export const PATCH = defineApiRoute({
|
||||
aufnahme_id: true,
|
||||
rechnung_id: true,
|
||||
created_at: true,
|
||||
updated_at: true
|
||||
updated_at: true,
|
||||
ausweisart: true
|
||||
}).merge(z.object({
|
||||
startdatum: z.coerce.date().nullable()
|
||||
})),
|
||||
|
||||
@@ -26,7 +26,8 @@ export const PUT = defineApiRoute({
|
||||
aufnahme_id: true,
|
||||
rechnung_id: true,
|
||||
created_at: true,
|
||||
updated_at: true
|
||||
updated_at: true,
|
||||
ausweisart: true
|
||||
}),
|
||||
aufnahme_id: UUidWithPrefix
|
||||
}),
|
||||
|
||||
@@ -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()
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
@@ -10,7 +10,6 @@ import ImpersonateUserModule from "#modules/ImpersonateUserModule.svelte";
|
||||
const caller = createCaller(Astro)
|
||||
|
||||
const params = Astro.params;
|
||||
const page = Number(params.page)
|
||||
|
||||
const user = await caller.user.self.GET.fetch(undefined, {
|
||||
headers: {
|
||||
|
||||
@@ -22,15 +22,15 @@ if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
|
||||
return Astro.redirect("/dashboard")
|
||||
}
|
||||
|
||||
const uid = Astro.url.searchParams.get("uid")
|
||||
const id = Astro.url.searchParams.get("id")
|
||||
|
||||
if (!uid) {
|
||||
if (!id) {
|
||||
return Astro.redirect("/404")
|
||||
}
|
||||
|
||||
const searchedUser = await prisma.benutzer.findUnique({
|
||||
where: {
|
||||
uid
|
||||
id
|
||||
}
|
||||
})
|
||||
|
||||
@@ -40,12 +40,12 @@ if (!searchedUser) {
|
||||
|
||||
const refreshTokenExpiry = moment().add(30, "days");
|
||||
const accessToken = encodeToken({
|
||||
uid: searchedUser.uid,
|
||||
id: searchedUser.id,
|
||||
typ: TokenType.Access,
|
||||
exp: moment().add(30, "minutes").valueOf(),
|
||||
});
|
||||
const refreshToken = encodeToken({
|
||||
uid: searchedUser.uid,
|
||||
id: searchedUser.id,
|
||||
typ: TokenType.Refresh,
|
||||
exp: refreshTokenExpiry.valueOf(),
|
||||
});
|
||||
@@ -60,7 +60,6 @@ Astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, accessToken, {
|
||||
path: "/",
|
||||
expires: moment().add(30, "minutes").toDate()
|
||||
})
|
||||
Astro.cookies.set("uid", searchedUser.uid)
|
||||
|
||||
return Astro.redirect("/dashboard")
|
||||
---
|
||||
@@ -1,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();
|
||||
---
|
||||
|
||||
<UserLayout title="Dashboard">
|
||||
<DashboardAusweiseModule user={user} client:load></DashboardAusweiseModule>
|
||||
</UserLayout>
|
||||
@@ -1,42 +1,5 @@
|
||||
---
|
||||
import { Enums, prisma } from "#lib/server/prisma";
|
||||
import { getCurrentUser } from "#lib/server/user";
|
||||
|
||||
const user = await getCurrentUser(Astro)
|
||||
|
||||
if (!user) {
|
||||
return Astro.redirect("/auth/login")
|
||||
}
|
||||
|
||||
const options: any = {
|
||||
where: user.rolle === Enums.BenutzerRolle.ADMIN ? {} : {
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
},
|
||||
orderBy: {
|
||||
created_at: "desc"
|
||||
}
|
||||
}
|
||||
|
||||
const lastVerbrauchsausweisWohnen = await prisma.verbrauchsausweisWohnen.findFirst(options)
|
||||
|
||||
if (lastVerbrauchsausweisWohnen) {
|
||||
return Astro.redirect(`/dashboard/objekte/${lastVerbrauchsausweisWohnen.id}`)
|
||||
}
|
||||
|
||||
const lastVerbrauchsausweisGewerbe = await prisma.verbrauchsausweisGewerbe.findFirst(options)
|
||||
|
||||
if (lastVerbrauchsausweisGewerbe) {
|
||||
return Astro.redirect(`/dashboard/objekte/${lastVerbrauchsausweisGewerbe.id}`)
|
||||
}
|
||||
|
||||
const lastBedarfsausweisWohnen = await prisma.bedarfsausweisWohnen.findFirst(options)
|
||||
|
||||
if (lastBedarfsausweisWohnen) {
|
||||
return Astro.redirect(`/dashboard/objekte/${lastBedarfsausweisWohnen.id}`)
|
||||
}
|
||||
|
||||
return Astro.redirect("/dashboard/objekte/1", 301);
|
||||
---
|
||||
|
||||
<script></script>
|
||||
@@ -1,81 +0,0 @@
|
||||
---
|
||||
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||
import { Enums, prisma } from "#lib/server/prisma";
|
||||
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||
import { getCurrentUser } from "#lib/server/user";
|
||||
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
|
||||
|
||||
const id = Astro.params.id as string;
|
||||
|
||||
const user = await getCurrentUser(Astro);
|
||||
|
||||
if (!user) {
|
||||
return Astro.redirect("/auth/login");
|
||||
}
|
||||
|
||||
|
||||
const adapter = getPrismaAusweisAdapter(id);
|
||||
|
||||
if (!adapter) {
|
||||
return Astro.redirect("/dashboard");
|
||||
}
|
||||
|
||||
const objekt = await prisma.objekt.findFirst({
|
||||
where: {
|
||||
OR: [
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_gewerbe: {
|
||||
some: {
|
||||
id,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_wohnen: {
|
||||
some: {
|
||||
id,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
bedarfsausweise_wohnen: {
|
||||
some: {
|
||||
id,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
include: {
|
||||
aufnahmen: {
|
||||
include: {
|
||||
bilder: true,
|
||||
unterlagen: true,
|
||||
bedarfsausweise_wohnen: true,
|
||||
verbrauchsausweise_gewerbe: true,
|
||||
verbrauchsausweise_wohnen: true
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
---
|
||||
|
||||
<UserLayout title="Objekte" {user}>
|
||||
<DashboardModule
|
||||
{user}
|
||||
{objekt}
|
||||
client:load
|
||||
/>
|
||||
</UserLayout>
|
||||
94
src/pages/dashboard/objekte/[page].astro
Normal file
94
src/pages/dashboard/objekte/[page].astro
Normal file
@@ -0,0 +1,94 @@
|
||||
---
|
||||
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||
import { Enums, prisma } from "#lib/server/prisma";
|
||||
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||
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 getCurrentUser(Astro)
|
||||
|
||||
if (!user) {
|
||||
return Astro.redirect("/auth/login")
|
||||
}
|
||||
|
||||
const totalPages = await prisma.objekt.count({
|
||||
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||
benutzer: {
|
||||
id: user.id
|
||||
}
|
||||
} : {}
|
||||
})
|
||||
|
||||
const objekte = await prisma.objekt.findMany({
|
||||
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||
benutzer: {
|
||||
id: user.id
|
||||
},
|
||||
} : {
|
||||
...(id ? {OR: [
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_gewerbe: {
|
||||
some: {
|
||||
id: {
|
||||
contains: id
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
verbrauchsausweise_wohnen: {
|
||||
some: {
|
||||
id: {
|
||||
contains: id
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
aufnahmen: {
|
||||
every: {
|
||||
bedarfsausweise_wohnen: {
|
||||
some: {
|
||||
id: {
|
||||
contains: id
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
},]} : {})
|
||||
},
|
||||
orderBy: {
|
||||
erstellungsdatum: "desc"
|
||||
},
|
||||
include: {
|
||||
aufnahmen: {
|
||||
include: {
|
||||
bilder: true,
|
||||
unterlagen: true,
|
||||
bedarfsausweise_wohnen: true,
|
||||
verbrauchsausweise_gewerbe: true,
|
||||
verbrauchsausweise_wohnen: true
|
||||
}
|
||||
}
|
||||
},
|
||||
take: 25,
|
||||
skip: (page - 1) * 25
|
||||
})
|
||||
---
|
||||
|
||||
<UserLayout title="Objekte" {user}>
|
||||
<DashboardModule {user} {objekte} totalPages={Math.ceil(totalPages / 25)} page={page} {id} client:load />
|
||||
</UserLayout>
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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) {
|
||||
---
|
||||
|
||||
<AusweisLayout title="Verbrauchsausweis erstellen">
|
||||
<VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {id} {ausweistyp} {user} loadFromDatabase={id !== null} />
|
||||
<VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {id} {ausweistyp} {user} loadFromDatabase={id !== null} partner_code="" />
|
||||
</AusweisLayout>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user