diff --git a/.github/workflows/dev-pipeline.yml b/.github/workflows/dev-pipeline.yml index 4446c5a3..c0de330f 100644 --- a/.github/workflows/dev-pipeline.yml +++ b/.github/workflows/dev-pipeline.yml @@ -1,10 +1,10 @@ -name: Dev Pipeline +name: Development Pipeline on: pull_request: - branches: [main] + branches: [dev] push: - branches: [main] + branches: [dev] jobs: deploy: @@ -26,8 +26,8 @@ jobs: export PATH=$HOME/.nvm/versions/node/v22.14.0/bin:$PATH echo $PATH cd ~/online-energieausweis - git reset --hard origin/main + git reset --hard origin/dev git clean -f -d - git pull origin main + git pull origin dev git status make prod \ No newline at end of file diff --git a/.github/workflows/prod-pipeline.yml b/.github/workflows/prod-pipeline.yml new file mode 100644 index 00000000..cf4e171d --- /dev/null +++ b/.github/workflows/prod-pipeline.yml @@ -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 \ No newline at end of file diff --git a/backup-database.bash b/backup-database.bash index 420566aa..dca6ef52 100644 --- a/backup-database.bash +++ b/backup-database.bash @@ -2,20 +2,27 @@ FILE_NAME=data-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br FILE_NAME_COMPLETE=full-dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.br -# Wir exportieren die Datenbank und komprimieren sie. -docker exec -t online-energieausweis-database-1 pg_dump --data-only -U main main | brotli --best > $FILE_NAME -docker exec -t online-energieausweis-database-1 pg_dumpall -c -U main | brotli --best > $FILE_NAME_COMPLETE # Das wird benötigt für AWS Ionos Kompatibilität. export AWS_REQUEST_CHECKSUM_CALCULATION=when_required export AWS_RESPONSE_CHECKSUM_VALIDATION=when_required +# Wir exportieren die Datenbank und komprimieren sie. # IMPORTANT: Dieser Befehl benötigt das `ionos` Profil, sonst wird er nicht funktionieren. # Das Profil kann mit `aws configure --profile ionos` erstellt werden. # Den Key dafür findet man auf https://dcd.ionos.com/latest/?lang=en#/key-management +docker exec -t online-energieausweis-database-1 pg_dump --data-only -U main main | brotli --best > $FILE_NAME + aws s3 cp $FILE_NAME s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD + +echo "Uploaded $FILE_NAME" + +docker exec -t online-energieausweis-database-1 pg_dumpall -c -U main | brotli --best > $FILE_NAME_COMPLETE + aws s3 cp $FILE_NAME_COMPLETE s3://ibc-db-backup/ --profile ionos --endpoint-url https://s3-eu-central-1.ionoscloud.com --storage-class STANDARD +echo "Uploaded $FILE_NAME_COMPLETE" + # Wir entfernen das Backup rm $FILE_NAME rm $FILE_NAME_COMPLETE \ No newline at end of file diff --git a/recover-db-dev.bash b/recover-db-dev.bash new file mode 100644 index 00000000..e7b58155 --- /dev/null +++ b/recover-db-dev.bash @@ -0,0 +1,41 @@ +#!/bin/bash + +# === Configuration === +BUCKET_NAME="ibc-db-backup" +ENDPOINT_URL="https://s3-eu-central-1.ionoscloud.com" +LOCAL_DOWNLOAD_DIR="./" # Where to save the file + +# === Get latest file from IONOS S3 bucket === +LATEST_FILE=$(aws s3api list-objects-v2 \ + --bucket "$BUCKET_NAME" \ + --prefix "data-dump" \ + --endpoint-url "$ENDPOINT_URL" \ + --query 'Contents | sort_by(@, &LastModified) | [-1].Key' \ + --output text) + +# === Check if file was found === +if [ "$LATEST_FILE" == "None" ] || [ -z "$LATEST_FILE" ]; then + echo "❌ No matching .sql.br file found." + exit 1 +fi + +FILENAME=$(basename "$LATEST_FILE") +SQL_FILE="${FILENAME%.br}" # Remove .br suffix + +echo "📥 Downloading $LATEST_FILE" +aws s3 cp "s3://$BUCKET_NAME/$LATEST_FILE" "$LOCAL_DOWNLOAD_DIR" \ + --endpoint-url "$ENDPOINT_URL" + +# === Decompress with Brotli === +echo "🗜️ Decompressing $FILENAME -> $SQL_FILE" +brotli -d "$FILENAME" + +# === Import into Postgres inside Docker === +echo "🐘 Importing into PostgreSQL (online-energieausweis-database-1:main)" +docker exec -i "online-energieausweis-database-1" env PGPASSWORD="hHMP8cd^N3SnzGRR" \ + psql -U "main" -d "main" < "$SQL_FILE" + +echo "✅ Import complete." + +# === Optional: Clean up +rm "$FILENAME" "$SQL_FILE" \ No newline at end of file diff --git a/src/components/Dashboard/DashboardAusweis.svelte b/src/components/Dashboard/DashboardAusweis.svelte index b39ffd98..8fa08c8a 100644 --- a/src/components/Dashboard/DashboardAusweis.svelte +++ b/src/components/Dashboard/DashboardAusweis.svelte @@ -15,7 +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 { 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; @@ -86,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)}` @@ -141,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 @@ -150,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, @@ -227,7 +244,11 @@ {:else if ausweis.bestellt} Bestellt {:else} - Gespeichert + {#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe} + Gespeichert + {:else} + Angefordert + {/if} {/if}
{objekt.adresse}
@@ -244,7 +265,7 @@

Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden innerhalb der nächsten 48 Stunden über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.

{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}

Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen Ihres Energieversorgers.

- {:else} + {:else if !ausweis.ausgestellt}

Der Ausweis wurde von Ihnen freigegeben und befindet sich in Prüfung vom IB Cornelsen

{/if} {/if} @@ -392,9 +413,9 @@ {/if} {#if benutzer.rolle === Enums.BenutzerRolle.ADMIN} - + - + {/if} Energieausweis {/if} - {#if objekt.aufnahmen.at(-1)?.bedarfsausweise_wohnen.length} - {@const ausweis = objekt.aufnahmen.at(-1)?.bedarfsausweise_wohnen.at(-1)} - -
- {#if ausweis?.ausgestellt} - Energieausweis ausgestellt - {:else} - Energieausweis ausgestellt - {/if} -
-
Energieausweis
-
- {/if}
{#each objekt.aufnahmen as aufnahme} diff --git a/src/components/Notifications/shared.ts b/src/components/Notifications/shared.ts index fcba5b92..dd4ff9e7 100644 --- a/src/components/Notifications/shared.ts +++ b/src/components/Notifications/shared.ts @@ -28,6 +28,12 @@ export function updateNotification(uid: string, updater: Partial) value[uid] = { ...defaults, ...value[uid], ...updater } as Notification; return value; }) + + if (updater.timeout) { + setTimeout(() => { + deleteNotification(uid); + }, updater.timeout); + } } export function addNotification(notification: Partial): string { diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts index 83d00205..dde2ebb5 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.ts @@ -2,7 +2,8 @@ import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#c import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js"; import moment from "moment"; -import bauwerkskatalog from "./bauwerkskatalog.json" assert { type: "json" } +import bauwerkskatalog from "./bauwerkskatalog.json" with { type: "json" } +import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient) { let tekWerte = new Array(8).fill(0); @@ -59,42 +60,12 @@ function vergleichsWertNichtWohngebaeude(ausweis: VerbrauchsausweisGewerbeClient * @param Ausweis ausweis Ein Ausweis dessen Energiebedarf berechnet werden soll * @return VerbrauchsausweisGewerbeCalculationResult */ -export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient) { - if (!aufnahme || !objekt || !ausweis) { +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, klimafaktoren: { month: number, year: number, klimafaktor: number }[]) { + if (!aufnahme || !objekt || !ausweis || !klimafaktoren) { return null; } const nutzflaeche = aufnahme.nutzflaeche || 0; - - let startdatum = moment(ausweis.startdatum); - - let klimafaktoren: Awaited> = [{ - month: startdatum.month(), - year: startdatum.year(), - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 1, - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 2, - klimafaktor: 1 - }]; - - try { - const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz) - - if (response) { - klimafaktoren = response - } - } catch (e) { - // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück. - // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung. - // return null - } // Endenergieverbrauch // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts new file mode 100644 index 00000000..0c8842b5 --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.ts @@ -0,0 +1,39 @@ +import moment from "moment"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "./VerbrauchsausweisGewerbe_2016.js"; +import { Aufnahme, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma.js"; +import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; + +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client( + ausweis: VerbrauchsausweisGewerbe, + aufnahme: Aufnahme, + objekt: Objekt, +) { + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktoren( + objekt.plz as string, + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); + + if (!klimafaktoren || klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } + + return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren) +} diff --git a/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts new file mode 100644 index 00000000..41032d89 --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.ts @@ -0,0 +1,39 @@ +import moment from "moment"; +import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "./VerbrauchsausweisGewerbe_2016.js"; +import { Aufnahme, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma.js"; + +export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server( + ausweis: VerbrauchsausweisGewerbe, + aufnahme: Aufnahme, + objekt: Objekt, +) { + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktorenServer( + objekt.plz as string, + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); + + if (klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } + + return await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt, klimafaktoren) +} diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts index 78f543db..60ed6296 100644 --- a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.ts @@ -1,8 +1,6 @@ import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; -import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor.js"; import { Enums } from "#lib/client/prisma.js"; -import moment from "moment"; export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016( ausweis: VerbrauchsausweisWohnenClient, @@ -24,43 +22,13 @@ export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016( export async function endEnergieVerbrauchVerbrauchsausweis_2016( ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, - objekt: ObjektClient + objekt: ObjektClient, + klimafaktoren: {month: number, year: number, klimafaktor: number}[] ) { - if (!aufnahme || !objekt || !ausweis) { + if (!aufnahme || !objekt || !ausweis || !klimafaktoren) { return null; } - let startdatum = moment(ausweis.startdatum); - - let klimafaktoren: Awaited> = [{ - month: startdatum.month(), - year: startdatum.year(), - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 1, - klimafaktor: 1 - }, - { - month: startdatum.month(), - year: startdatum.year() + 2, - klimafaktor: 1 - }]; - - try { - const response = await getKlimafaktoren(ausweis.startdatum, objekt.plz) - - if (response) { - klimafaktoren = response - } - } catch (e) { - // TODO: Entweder setzen wir hier mit falschen Klimafaktoren fort, oder wir geben null zurück. - // Im Moment setzen wir einfach fort, aber das ist nicht unbedingt die beste Lösung. - // return null - } - - // Endenergieverbrauch // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. let brennstoff_1 = getHeizwertfaktor( diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts new file mode 100644 index 00000000..7bee248d --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.ts @@ -0,0 +1,43 @@ +import { + VerbrauchsausweisWohnenClient, + AufnahmeClient, + ObjektClient, +} from "#components/Ausweis/types.js"; +import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; +import moment from "moment"; +import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen_2016.js"; + +export async function endEnergieVerbrauchVerbrauchsausweis_2016_Client( + ausweis: VerbrauchsausweisWohnenClient, + aufnahme: AufnahmeClient, + objekt: ObjektClient, +) { + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktoren( + objekt.plz as string, + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); + + if (!klimafaktoren || klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } + + return await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt, klimafaktoren) +} diff --git a/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts new file mode 100644 index 00000000..283249d1 --- /dev/null +++ b/src/lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.ts @@ -0,0 +1,48 @@ +import { + VerbrauchsausweisWohnenClient, + AufnahmeClient, + ObjektClient, +} from "#components/Ausweis/types.js"; +import moment from "moment"; +import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen_2016.js"; +import { getKlimafaktorenServer } from "#lib/server/klimafaktoren.js"; + +export async function endEnergieVerbrauchVerbrauchsausweis_2016_Server( + ausweis: VerbrauchsausweisWohnenClient, + aufnahme: AufnahmeClient, + objekt: ObjektClient +) { + const startdatum = moment(ausweis.startdatum); + let klimafaktoren = await getKlimafaktorenServer( + objekt.plz as string, + startdatum.toDate(), + startdatum.add(2, "years").toDate() + ); + + if (klimafaktoren.length === 0) { + klimafaktoren = [ + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year"), + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 1, + }, + { + klimafaktor: 1, + month: startdatum.get("m"), + year: startdatum.get("year") + 2, + }, + ]; + } + + return await endEnergieVerbrauchVerbrauchsausweis_2016( + ausweis, + aufnahme, + objekt, + klimafaktoren + ); +} diff --git a/src/lib/Berechnungen/endEnergieVerbrauch.ts b/src/lib/Berechnungen/endEnergieVerbrauch.ts deleted file mode 100644 index 4edb4de2..00000000 --- a/src/lib/Berechnungen/endEnergieVerbrauch.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { VerbrauchsausweisWohnen } from "#lib/client/prisma"; -import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "./VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; -import { AufnahmeClient, ObjektClient } from "#components/Ausweis/types.js"; - -export async function endEnergieVerbrauch(ausweis: VerbrauchsausweisWohnen, aufnahme: AufnahmeClient, objekt: ObjektClient): Promise { - const result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); - - if (!result) { - return 0; - } - - return result.endEnergieVerbrauchGesamt; -} \ No newline at end of file diff --git a/src/lib/Klimafaktoren.ts b/src/lib/Klimafaktoren.ts index 5326b948..9dbed741 100644 --- a/src/lib/Klimafaktoren.ts +++ b/src/lib/Klimafaktoren.ts @@ -18,8 +18,6 @@ export const getKlimafaktoren = memoize(async (date: Date, plz: string) => { }); return response; } catch (e) { - console.log(e); - return null; } }); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 48b23008..271410da 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -112,4 +112,4 @@ export const SERVICES: Record< }; export const BASE_URI = process.env.NODE_ENV == "production" ? "https://online-energieausweis.org" : "http://localhost:3000"; -export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "znjmkmbA3Hbx9dC7wdKp7TnOf1pcRl_tCUwEBZys7bj-QRPG" \ No newline at end of file +export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" \ No newline at end of file diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts index 6a9d4c56..05811876 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts @@ -4,8 +4,8 @@ import { PDFDocument, StandardFonts } from "pdf-lib"; import { xml2pdf } from "./elements/xml2pdf.js"; import moment from "moment"; import { Enums, Heizungsstatus } from "#lib/server/prisma.js"; -import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; import { copyPage } from "./utils/copyPage.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -18,7 +18,7 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(ausweis, aufnahme, objekt); const height = pages[0].getHeight() const width = pages[0].getWidth() diff --git a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts index 54f69d4b..4c7d1ab1 100644 --- a/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.ts @@ -6,6 +6,7 @@ import { xml2pdf } from "./elements/xml2pdf.js"; import moment from "moment"; import { Enums, Heizungsstatus } from "#lib/server/prisma.js"; import { copyPage } from "./utils/copyPage.js"; +import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js"; /* -------------------------------- Pdf Tools ------------------------------- */ @@ -19,7 +20,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016_Server(ausweis, aufnahme, objekt); const height = pages[0].getHeight() const width = pages[0].getWidth() @@ -332,8 +333,5 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau await layoutPage2.draw(pages[1], 0, pages[1].getHeight()) await layoutPage3.draw(pages[2], 0, pages[2].getHeight()) - console.log("DONE"); - - return pdf.save(); } \ No newline at end of file diff --git a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts index f0f9862e..4b02ac93 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisGewerbe.ts @@ -1,5 +1,4 @@ import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; -import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js"; import { Enums } from "#lib/server/prisma.js"; import * as fs from "fs" @@ -7,18 +6,19 @@ import moment from "moment"; import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib"; import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; -import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; +import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; +import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js"; -export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient) { +export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) { const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64"); const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const pages = pdf.getPages() // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(ausweis, aufnahme, objekt); const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) @@ -612,10 +612,16 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe } - for (const page of pages) { - addAnsichtsausweisLabel(page, font) - addDatumGEG(page, font) - } + for (let i = 0; i < pages.length; i++) { + const page = pages[i]; + if (vorschau) { + addAnsichtsausweisLabel(page, font) + } + addDatumGEG(page, font) + if (i !== pages.length - 1) { + addRegistriernummer(page, font, ausweis.registriernummer || "") + } + } diff --git a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts index e2b2ce5c..55bb779e 100644 --- a/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts +++ b/src/lib/pdf/pdfVerbrauchsausweisWohnen.ts @@ -1,5 +1,4 @@ import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; -import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js"; import { Enums } from "#lib/server/prisma.js"; import * as fs from "fs" @@ -7,19 +6,21 @@ import moment from "moment"; import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib"; import { addCheckMark } from "./utils/checkbox.js"; import { addText } from "./utils/text.js"; -import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js"; +import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js"; import { getS3File } from "#lib/s3.js"; +import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js"; /* -------------------------------- Pdf Tools ------------------------------- */ -export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient) { +export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) { const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Wohngebaeude_ohne_pfeile.pdf", import.meta.url), "base64"); const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF) const pages = pdf.getPages() // const template = VerbrauchsausweisWohnen2016Template as Template; - const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); + const berechnungen = await endEnergieVerbrauchVerbrauchsausweis_2016_Server(ausweis, aufnahme, objekt); + const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt) const height = pages[0].getHeight() @@ -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) { - addAnsichtsausweisLabel(page, font) + for (let i = 0; i < pages.length; i++) { + const page = pages[i]; + if (vorschau) { + addAnsichtsausweisLabel(page, font) + } addDatumGEG(page, font) + if (i !== pages.length - 1) { + addRegistriernummer(page, font, ausweis.registriernummer || "") + } } return pdf.save(); diff --git a/src/lib/pdf/utils/helpers.ts b/src/lib/pdf/utils/helpers.ts index dd9d3655..07a7bd5b 100644 --- a/src/lib/pdf/utils/helpers.ts +++ b/src/lib/pdf/utils/helpers.ts @@ -22,3 +22,13 @@ export function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) { opacity: 0.3, }); } + + +export function addRegistriernummer(page: PDFPage, font: PDFFont, registriernummer: string) { + page.drawText(registriernummer, { + x: 435, + y: page.getHeight() - 113, + size: 10, + font, + }); +} \ No newline at end of file diff --git a/src/lib/server/ausweis.ts b/src/lib/server/ausweis.ts index 3e37c7c7..d92a1896 100644 --- a/src/lib/server/ausweis.ts +++ b/src/lib/server/ausweis.ts @@ -31,15 +31,15 @@ export function getPrismaAusweisAdapter(id: string) { * Gibt den richtigen Ansichtsausweis basierend auf der Ausweisart zurück. * @param ausweis */ -export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromId(ausweis.id)) { +export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau: boolean = true, ausweisart = getAusweisartFromId(ausweis.id)) { if (!ausweisart) { return null } if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { - return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user) + return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user, vorschau) } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { - return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user) + return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, vorschau) } return null diff --git a/src/lib/server/db.ts b/src/lib/server/db.ts index bf628b9d..39235642 100644 --- a/src/lib/server/db.ts +++ b/src/lib/server/db.ts @@ -8,6 +8,26 @@ export async function getVerbrauchsausweisWohnen(id: string): Promise { return await prisma.verbrauchsausweisGewerbe.findUnique({ where: { @@ -16,6 +36,26 @@ export async function getVerbrauchsausweisGewerbe(id: string): Promise { return await prisma.bedarfsausweisWohnen.findUnique({ where: { @@ -24,6 +64,26 @@ export async function getBedarfsausweisWohnen(id: string): Promise { return await prisma.bedarfsausweisGewerbe.findUnique({ where: { diff --git a/src/lib/server/invoice.ts b/src/lib/server/invoice.ts new file mode 100644 index 00000000..43f4160f --- /dev/null +++ b/src/lib/server/invoice.ts @@ -0,0 +1,191 @@ +import { getAusweisartFromId } from "#components/Ausweis/types.js"; +import moment from "moment"; +import { createLexOfficeCustomer } from "./lexoffice.js"; +import { Enums, prisma, Rechnung, VerbrauchsausweisWohnen } from "./prisma.js"; +import { LEX_OFFICE_API_KEY, PRICES } from "#lib/constants.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 + } + }; +} + +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: VerbrauchsausweisWohnen, rechnung: Rechnung) { + 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": [], + "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 = { + [Enums.Bezahlmethoden.paypal]: "PayPal", + [Enums.Bezahlmethoden.creditcard]: "Kreditkarte", + [Enums.Bezahlmethoden.sofort]: "Sofortüberweisung", + [Enums.Bezahlmethoden.giropay]: "Giropay", + }; + + 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"] + } +} \ No newline at end of file diff --git a/src/lib/server/klimafaktoren.ts b/src/lib/server/klimafaktoren.ts new file mode 100644 index 00000000..6c33dc97 --- /dev/null +++ b/src/lib/server/klimafaktoren.ts @@ -0,0 +1,47 @@ +import moment from "moment"; +import { prisma } from "./prisma.js"; + +export async function getKlimafaktorenServer(plz: string, startdatum: Date, enddatum: Date) { + const start = moment(startdatum); + const end = moment(enddatum); + + if (start.isSameOrAfter(end)) { + return [] + } + + const intervals = []; + + let currentDate = start.clone(); + while (currentDate.isSameOrBefore(end)) { + let copy = currentDate.clone(); + intervals.push(copy); + currentDate.add(1, "year"); + } + + let klimafaktoren = await prisma.klimafaktoren.findMany({ + where: { + plz, + month: intervals[0].month(), + OR: intervals.map((date) => { + return { + year: date.year(), + }; + }), + }, + }); + + if (!klimafaktoren) { + return [] + } + + // NOTE: Sollten wir hier lieber den Output padden und trotzdem die gefundenen zurückgeben? + if (klimafaktoren.length !== intervals.length) { + return [] + } + + return klimafaktoren.map((klimafaktor) => ({ + month: klimafaktor.month, + year: klimafaktor.year, + klimafaktor: klimafaktor.klimafaktor, + })); +} diff --git a/src/lib/server/lexoffice.ts b/src/lib/server/lexoffice.ts index df52a8e9..e2bf82b7 100644 --- a/src/lib/server/lexoffice.ts +++ b/src/lib/server/lexoffice.ts @@ -1,10 +1,10 @@ import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { LEX_OFFICE_API_KEY } from "#lib/constants.js"; -import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma"; -import { prisma } from "#lib/server/prisma"; +import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js"; +import { prisma } from "#lib/server/prisma.js"; import moment from "moment"; -export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: { +export async function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: { bezeichnung: string, positionstext: string, preis: number, @@ -103,149 +103,149 @@ export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | Bedarf throw new Error(`Ein Fehler ist aufgetreten: ${pdfResult.message}`); } - $pdf_id = $render_response["documentFileId"]; + // $pdf_id = $render_response["documentFileId"]; - db()->execute("UPDATE Angebotsanfragen SET - Adresse_Objekt = :Adresse_Objekt, - PLZ_Objekt = :PLZ_Objekt, - Ort_Objekt = :Ort_Objekt, - Dienstleistung = :Dienstleistung, - Empfaengerrechnung = :Empfaengerrechnung, - Zusatzzeilerechnung = :Zusatzzeilerechnung, - Adresse = :Adresse, - PLZ = :PLZ, - Ort = :Ort, - Anlass = :Anlass, - Baujahrheizung = :Baujahrheizung, - Baujahrgebaeude = :Baujahrgebaeude, - Baujahrklima = :Baujahrklima, - Gebaeudetyp = :Gebaeudetyp, - Nutzflaeche = :Nutzflaeche, - Sanierungsstatus = :Sanierungsstatus, - Nachricht = :Nachricht, - Datei = :Datei, - Rolle = :Rolle, - Email = :Email, - Angebotspreis = :Angebotspreis, - Rabatt = :Rabatt, - `Status` = 'Verschickt', - lex_office_id = :lex_office_id, - Textanschreiben = :Textanschreiben, - Positionstext = :Positionstext - WHERE Auftragsnummer = :Auftragsnummer", [ - "Adresse_Objekt": $_POST["gebaeude_strasse"], - "PLZ_Objekt": $_POST["gebaeude_plz"], - "Ort_Objekt": $_POST["gebaeude_ort"], - "Dienstleistung": $_POST["dienstleistung"], - "Empfaengerrechnung": $_POST["rechnung_empfaenger"], - "Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"], - "Adresse": $_POST["rechnung_strasse"], - "PLZ": $_POST["rechnung_plz"], - "Ort": $_POST["rechnung_ort"], - "Anlass": $_POST["anlass"], - "Baujahrheizung": $_POST["baujahr_heizung"], - "Baujahrgebaeude": $_POST["baujahr_gebaeude"], - "Baujahrklima": $_POST["baujahr_klimaanlage"], - "Gebaeudetyp": $_POST["gebaeudetyp"], - "Nutzflaeche": $_POST["nutzflaeche"], - "Sanierungsstatus": $_POST["sanierungsstatus"], - "Nachricht": $_POST["nachricht"], - "Datei": $dateien, - "Rolle": $_POST["rolle"], - "Email": $_POST["email"], - "Angebotspreis": $_POST["Angebotspreis"], - "Rabatt": $_POST["Rabatt"], - "lex_office_id": $lex_office_id, - "Textanschreiben": $_POST["Textanschreiben"], - "Positionstext": $_POST["Positionstext"], - "Auftragsnummer": $_POST["Auftragsnummer"] - ]); + // db()->execute("UPDATE Angebotsanfragen SET + // Adresse_Objekt = :Adresse_Objekt, + // PLZ_Objekt = :PLZ_Objekt, + // Ort_Objekt = :Ort_Objekt, + // Dienstleistung = :Dienstleistung, + // Empfaengerrechnung = :Empfaengerrechnung, + // Zusatzzeilerechnung = :Zusatzzeilerechnung, + // Adresse = :Adresse, + // PLZ = :PLZ, + // Ort = :Ort, + // Anlass = :Anlass, + // Baujahrheizung = :Baujahrheizung, + // Baujahrgebaeude = :Baujahrgebaeude, + // Baujahrklima = :Baujahrklima, + // Gebaeudetyp = :Gebaeudetyp, + // Nutzflaeche = :Nutzflaeche, + // Sanierungsstatus = :Sanierungsstatus, + // Nachricht = :Nachricht, + // Datei = :Datei, + // Rolle = :Rolle, + // Email = :Email, + // Angebotspreis = :Angebotspreis, + // Rabatt = :Rabatt, + // `Status` = 'Verschickt', + // lex_office_id = :lex_office_id, + // Textanschreiben = :Textanschreiben, + // Positionstext = :Positionstext + // WHERE Auftragsnummer = :Auftragsnummer", [ + // "Adresse_Objekt": $_POST["gebaeude_strasse"], + // "PLZ_Objekt": $_POST["gebaeude_plz"], + // "Ort_Objekt": $_POST["gebaeude_ort"], + // "Dienstleistung": $_POST["dienstleistung"], + // "Empfaengerrechnung": $_POST["rechnung_empfaenger"], + // "Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"], + // "Adresse": $_POST["rechnung_strasse"], + // "PLZ": $_POST["rechnung_plz"], + // "Ort": $_POST["rechnung_ort"], + // "Anlass": $_POST["anlass"], + // "Baujahrheizung": $_POST["baujahr_heizung"], + // "Baujahrgebaeude": $_POST["baujahr_gebaeude"], + // "Baujahrklima": $_POST["baujahr_klimaanlage"], + // "Gebaeudetyp": $_POST["gebaeudetyp"], + // "Nutzflaeche": $_POST["nutzflaeche"], + // "Sanierungsstatus": $_POST["sanierungsstatus"], + // "Nachricht": $_POST["nachricht"], + // "Datei": $dateien, + // "Rolle": $_POST["rolle"], + // "Email": $_POST["email"], + // "Angebotspreis": $_POST["Angebotspreis"], + // "Rabatt": $_POST["Rabatt"], + // "lex_office_id": $lex_office_id, + // "Textanschreiben": $_POST["Textanschreiben"], + // "Positionstext": $_POST["Positionstext"], + // "Auftragsnummer": $_POST["Auftragsnummer"] + // ]); - // Die Auftragsnummer abfragen + // // Die Auftragsnummer abfragen - $curl_nummer = curl_init(); + // $curl_nummer = curl_init(); - curl_setopt_array($curl_nummer, [ - CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id", - CURLOPT_RETURNTRANSFER: true, - CURLOPT_ENCODING: "", - CURLOPT_MAXREDIRS: 10, - CURLOPT_TIMEOUT: 30, - CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST: "GET", - CURLOPT_HTTPHEADER: [ - "Accept: application/json", - "Authorization: Bearer " . LEX_OFFICE_API_KEY - ] - ]); + // curl_setopt_array($curl_nummer, [ + // CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id", + // CURLOPT_RETURNTRANSFER: true, + // CURLOPT_ENCODING: "", + // CURLOPT_MAXREDIRS: 10, + // CURLOPT_TIMEOUT: 30, + // CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, + // CURLOPT_CUSTOMREQUEST: "GET", + // CURLOPT_HTTPHEADER: [ + // "Accept: application/json", + // "Authorization: Bearer " . LEX_OFFICE_API_KEY + // ] + // ]); - $nummer_response = curl_exec($curl_nummer); - $nummer_response = json_decode($nummer_response, true); - $err = curl_error($curl_nummer); + // $nummer_response = curl_exec($curl_nummer); + // $nummer_response = json_decode($nummer_response, true); + // $err = curl_error($curl_nummer); - curl_close($curl_nummer); + // curl_close($curl_nummer); - // Und die Mail verschicken + // // Und die Mail verschicken - $mail = new PHPMailer\PHPMailer\PHPMailer(true); + // $mail = new PHPMailer\PHPMailer\PHPMailer(true); - $mail->IsSMTP(); - $mail->Host = "smtp.ionos.de"; - $mail->SMTPAuth = true; - $mail->Username = 'info@online-energieausweis.org'; - $mail->Password = 'Katendeich5a2024!'; + // $mail->IsSMTP(); + // $mail->Host = "smtp.ionos.de"; + // $mail->SMTPAuth = true; + // $mail->Username = 'info@online-energieausweis.org'; + // $mail->Password = 'Katendeich5a2024!'; - $mail->CharSet = 'UTF-8'; - $mail->Encoding = 'base64'; - $mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0); - $mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]); - $mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen"); - $mail->isHTML(true); - $mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}"; + // $mail->CharSet = 'UTF-8'; + // $mail->Encoding = 'base64'; + // $mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0); + // $mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]); + // $mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen"); + // $mail->isHTML(true); + // $mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}"; - // carriage return type (RFC) - $eol = "
"; - $anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"]; + // // carriage return type (RFC) + // $eol = "
"; + // $anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"]; - $message = "$anrede {$_POST["name"]},{$eol}{$eol}"; - $message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}"; - $message .= "Mit freundlichen Grüßen,$eol"; - $message .= "Jens Cornelsen$eol"; - $message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon 040 209339858{$eol}Fax 040 209339859"; - $mail->Body = $message; + // $message = "$anrede {$_POST["name"]},{$eol}{$eol}"; + // $message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}"; + // $message .= "Mit freundlichen Grüßen,$eol"; + // $message .= "Jens Cornelsen$eol"; + // $message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon 040 209339858{$eol}Fax 040 209339859"; + // $mail->Body = $message; - $curl_pdf = curl_init(); + // $curl_pdf = curl_init(); - curl_setopt_array($curl_pdf, [ - CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id", - CURLOPT_RETURNTRANSFER: true, - CURLOPT_ENCODING: "", - CURLOPT_MAXREDIRS: 10, - CURLOPT_TIMEOUT: 30, - CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST: "GET", - CURLOPT_HTTPHEADER: [ - "Accept: application/pdf", - "Authorization: Bearer " . LEX_OFFICE_API_KEY - ] - ]); + // curl_setopt_array($curl_pdf, [ + // CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id", + // CURLOPT_RETURNTRANSFER: true, + // CURLOPT_ENCODING: "", + // CURLOPT_MAXREDIRS: 10, + // CURLOPT_TIMEOUT: 30, + // CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1, + // CURLOPT_CUSTOMREQUEST: "GET", + // CURLOPT_HTTPHEADER: [ + // "Accept: application/pdf", + // "Authorization: Bearer " . LEX_OFFICE_API_KEY + // ] + // ]); - $response = curl_exec($curl_pdf); - $err = curl_error($curl_pdf); + // $response = curl_exec($curl_pdf); + // $err = curl_error($curl_pdf); - $HOME = dirname($ROOT); + // $HOME = dirname($ROOT); - curl_close($curl_pdf); - $fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+"); - fwrite($fp, $response); - fclose($fp); + // curl_close($curl_pdf); + // $fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+"); + // fwrite($fp, $response); + // fclose($fp); - $mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf"); + // $mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf"); - $mail->send(); + // $mail->send(); - echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen."; + // echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen."; } export async function createLexOfficeCustomer(user: Benutzer) { diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index 2a1202fd..1c1a25e4 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -36,6 +36,8 @@ export let unterlagen: Unterlage[] = []; export let id: string | null; + export let partner_code: string; + export let loadFromDatabase: boolean = false; // Wir holen die daten aus dem LocalStorage falls @@ -143,6 +145,7 @@ bind:unterlagen bind:blockLocalStorageSync {ausweisart} + {partner_code} showWeiter={false} {form} {skala} @@ -277,6 +280,7 @@ bind:unterlagen bind:blockLocalStorageSync {ausweisart} + {partner_code} showWeiter={true} {form} {skala} diff --git a/src/modules/Dashboard/DashboardAufnahmeModule.svelte b/src/modules/Dashboard/DashboardAufnahmeModule.svelte index fcc60428..2b6e7d17 100644 --- a/src/modules/Dashboard/DashboardAufnahmeModule.svelte +++ b/src/modules/Dashboard/DashboardAufnahmeModule.svelte @@ -4,7 +4,7 @@ import Carousel from "#components/Carousel.svelte"; import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte"; import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte"; - import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte"; + import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte"; import { Objekt } from "#lib/client/prisma.js"; import mime from "mime" import { ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons"; @@ -96,5 +96,5 @@
- +
\ No newline at end of file diff --git a/src/modules/Dashboard/DashboardAusweiseModule.svelte b/src/modules/Dashboard/DashboardAusweiseModule.svelte deleted file mode 100644 index cb4070f5..00000000 --- a/src/modules/Dashboard/DashboardAusweiseModule.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - -{#if errorCount > 0} -

Wichtiges

- -
- {#each ausweisUeberpruefung as { errors }} - {#if errors.length > 0} -
-
-
{errors[0].severity == "error" ? "Achtung!" : "Wichtig!"}
-

{errors[0].title}

-

{errors[0].description}

- {#if errors[0].resolvehref} -
- Beheben -
- {/if} -
-
- {/if} - {/each} -
-{/if} - -

Ihre Ausweise

- -
- - {#if ausweise === null} - - {:else} - {#if ausweise.length == 0} -
-

Es konnten keine Ausweise gefunden werden.

-

Erstellen sie einen Verbrauchsausweis für ihr Wohngebäude hier

-
- {:else} - {#each ausweise as ausweis, i} - - {/each} - {/if} - {/if} - -
- -
-
- - - - -
-
\ No newline at end of file diff --git a/src/modules/KundendatenModule.svelte b/src/modules/KundendatenModule.svelte index 30e3e76a..d0944afb 100644 --- a/src/modules/KundendatenModule.svelte +++ b/src/modules/KundendatenModule.svelte @@ -211,7 +211,7 @@ versand_plz: versand_plz, versand_ort: versand_ort, telefon: telefon, - nachweis_id: result.nachweis_id, + nachweis_id: result.nachweis_id }, { headers: { @@ -291,7 +291,7 @@ let result: Awaited> | Awaited> | null = null; if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { - result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) + result = await nachweisSpeichern(ausweis as unknown as GEGNachweisWohnen, objekt, aufnahme, bilder, unterlagen, ausweisart) } else { result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) } diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte index e4ea4a8b..22bfb6de 100644 --- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte +++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte @@ -49,6 +49,7 @@ export let bilder: BildClient[]; export let id: string | null; + export let partner_code: string; export let loadFromDatabase: boolean = false; const ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe @@ -128,6 +129,7 @@ ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} showWeiter={false} {form} + {partner_code} {skala} > @@ -244,6 +246,7 @@ ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} showWeiter={true} {form} + {partner_code} {skala} > diff --git a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte index 2e546118..0e2f0f4e 100644 --- a/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte +++ b/src/modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte @@ -160,6 +160,7 @@ let skala: HTMLDivElement; bind:aufnahme ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen} showWeiter={false} + {partner_code} {form} {skala} > diff --git a/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro b/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro index d4373c1d..929beaf4 100644 --- a/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro +++ b/src/pages/[partner]/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro @@ -1,84 +1,91 @@ --- -import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro"; + +import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte"; -import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; -import { createCaller } from "src/astro-typesafe-api-caller"; -import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; -import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; -import { Enums } from "#lib/server/prisma"; +import { Aufnahme, BedarfsausweisWohnen, Bild, Enums, Objekt } from "#lib/server/prisma"; +import { getAufnahme, getObjekt, getBilder, getBedarfsausweisWohnen } from "#lib/server/db"; +import { getCurrentUser } from "#lib/server/user"; -const id = Astro.url.searchParams.get("uid") || ""; +const id = Astro.url.searchParams.get("id"); const aufnahme_id = Astro.url.searchParams.get("aufnahme") -const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard; -let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient; -let aufnahme: AufnahmeClient = {} as AufnahmeClient; -let objekt: ObjektClient = {} as ObjektClient; -let bilder: BildClient[] = [] +let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard; +const partner_code = Astro.params.partner as string; -const valid = validateAccessTokenServer(Astro); +let ausweis: BedarfsausweisWohnen = {} as BedarfsausweisWohnen; +let aufnahme: Aufnahme = {} as Aufnahme; +let objekt: Objekt = {} as Objekt; +let bilder: Bild[] = [] -const caller = createCaller(Astro); +const user = await getCurrentUser(Astro) if (id) { - if (!valid) { + if (!user) { return Astro.redirect( `/auth/login?redirect=${Astro.url.toString()}` ); } - try { - ausweis = await caller["bedarfsausweis-wohnen"]._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id - } - }); + ausweis = await getBedarfsausweisWohnen(id) as BedarfsausweisWohnen + ausweistyp = ausweis.ausweistyp; - aufnahme = await caller.aufnahme._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: ausweis.aufnahme_id - } - }) + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { + // Der Ausweis scheint nicht zu existieren. + // Wir leiten auf die generische Ausweisseite ohne ID weiter. + return Astro.redirect( + "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" + ); + } - objekt = await caller.objekt._id.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: ausweis.objekt_id - } - }) + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme - bilder = await caller.aufnahme._id.bilder.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - id: ausweis.aufnahme_id - } - }) + if (!aufnahme) { + // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" + ); + } - if (!ausweis) { - // Der Ausweis scheint nicht zu existieren. - // Wir leiten auf die generische Ausweisseite ohne UID weiter. - return Astro.redirect( - "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" - ); - } - } catch(e) { + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" + ); + } + + bilder = await getBilder(aufnahme.id); +} else if (aufnahme_id) { + if (!user) { + return Astro.redirect( + `/auth/login?redirect=${Astro.url.toString()}` + ); + } + + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme + + if (!aufnahme) { + // Die Aufnahme existiert wohl nicht. + return Astro.redirect( + "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" + ); + } + + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht. return Astro.redirect( "/energieausweis-erstellen/bedarfsausweis-wohngebaeude" ); } } +console.log(ausweistyp); + + --- - - + + \ No newline at end of file diff --git a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro index 90793f9d..190b9acc 100644 --- a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro +++ b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro @@ -1,79 +1,80 @@ --- -import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro"; -import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types"; -import { createCaller } from "src/astro-typesafe-api-caller"; -import { inferOutput } from "astro-typesafe-api/client"; -import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; -import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; +import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; +import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types"; import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte"; -import { Enums } from "#lib/server/prisma"; +import { Aufnahme, Enums, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma"; +import { getAufnahme, getObjekt, getBilder, getVerbrauchsausweisGewerbe } from "#lib/server/db"; +import { getCurrentUser } from "#lib/server/user"; -const uid = Astro.url.searchParams.get("uid"); -const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard; +const id = Astro.url.searchParams.get("id"); +const aufnahme_id = Astro.url.searchParams.get("aufnahme") +let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard; +const partner_code = Astro.params.partner as string; let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient; let objekt: ObjektClient = {} as ObjektClient; -let bilder: UploadedGebaeudeBild[] = [] +let bilder: BildClient[] = [] -const valid = validateAccessTokenServer(Astro); +const user = await getCurrentUser(Astro) -const caller = createCaller(Astro); - -if (uid) { - if (!valid) { +if (id) { + if (!user) { return Astro.redirect( `/auth/login?redirect=${Astro.url.toString()}` ); } - try { - let { uid_aufnahme, uid_objekt, uid_benutzer, ...result } = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid - } - }); + ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe + ausweistyp = ausweis.ausweistyp; - ausweis = result + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { + // Der Ausweis scheint nicht zu existieren. + // Wir leiten auf die generische Ausweisseite ohne ID weiter. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } - aufnahme = await caller.aufnahme._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: uid_aufnahme - } - }) + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme - objekt = await caller.objekt._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: uid_objekt - } - }) + if (!aufnahme) { + // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } - bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: uid_aufnahme - } - }) + objekt = await getObjekt(aufnahme.objekt_id) as Objekt - if (!ausweis) { - // Der Ausweis scheint nicht zu existieren. - // Wir leiten auf die generische Ausweisseite ohne UID weiter. - return Astro.redirect( - "/energieausweis-erstellen/verbrauchsausweis-gewerbe" - ); - } - } catch(e) { + if (!objekt) { + // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } + + bilder = await getBilder(aufnahme.id); +} else if (aufnahme_id) { + if (!user) { + return Astro.redirect( + `/auth/login?redirect=${Astro.url.toString()}` + ); + } + + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme + + if (!aufnahme) { + // Die Aufnahme existiert wohl nicht. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-gewerbe" + ); + } + + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht. return Astro.redirect( "/energieausweis-erstellen/verbrauchsausweis-gewerbe" ); @@ -81,6 +82,6 @@ if (uid) { } --- - - + + \ No newline at end of file diff --git a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro index a0b1cf47..467385b4 100644 --- a/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro +++ b/src/pages/[partner]/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro @@ -1,77 +1,79 @@ --- import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro"; import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte"; -import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; -import { createCaller } from "src/astro-typesafe-api-caller"; -import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants"; -import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; -import { Enums } from "#lib/server/prisma"; +import { Aufnahme, Bild, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/server/prisma"; +import { getVerbrauchsausweisWohnen, getAufnahme, getObjekt, getBilder } from "#lib/server/db"; +import { getCurrentUser } from "#lib/server/user"; -const uid = Astro.url.searchParams.get("uid"); -const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard; +const id = Astro.url.searchParams.get("id"); +const aufnahme_id = Astro.url.searchParams.get("aufnahme") +let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard; +const partner_code = Astro.params.partner as string; +let ausweis: VerbrauchsausweisWohnen = {} as VerbrauchsausweisWohnen; +let aufnahme: Aufnahme = {} as Aufnahme; +let objekt: Objekt = {} as Objekt; +let bilder: Bild[] = [] -let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient; -let aufnahme: AufnahmeClient = {} as AufnahmeClient; -let objekt: ObjektClient = {} as ObjektClient; -let bilder: UploadedGebaeudeBild[] = [] +const user = await getCurrentUser(Astro) -const valid = validateAccessTokenServer(Astro); - -const caller = createCaller(Astro); - -if (uid) { - if (!valid) { +if (id) { + if (!user) { return Astro.redirect( `/auth/login?redirect=${Astro.url.toString()}` ); } - try { - ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid - } - }); + ausweis = await getVerbrauchsausweisWohnen(id) as VerbrauchsausweisWohnen + ausweistyp = ausweis.ausweistyp; - aufnahme = await caller.aufnahme._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: ausweis.uid_aufnahme - } - }) + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { + // Der Ausweis scheint nicht zu existieren. + // Wir leiten auf die generische Ausweisseite ohne ID weiter. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } - objekt = await caller.objekt._uid.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: ausweis.uid_objekt - } - }) + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme - bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, { - headers: { - authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` - }, - params: { - uid: ausweis.uid_aufnahme - } - }) + if (!aufnahme) { + // Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } - if (!ausweis) { - // Der Ausweis scheint nicht zu existieren. - // Wir leiten auf die generische Ausweisseite ohne UID weiter. - return Astro.redirect( - "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" - ); - } - } catch(e) { + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } + + bilder = await getBilder(aufnahme.id); +} else if (aufnahme_id) { + if (!user) { + return Astro.redirect( + `/auth/login?redirect=${Astro.url.toString()}` + ); + } + + aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme + + if (!aufnahme) { + // Die Aufnahme existiert wohl nicht. + return Astro.redirect( + "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" + ); + } + + objekt = await getObjekt(aufnahme.objekt_id) as Objekt + + if (!objekt) { + // Das Objekt existiert nicht. return Astro.redirect( "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" ); @@ -81,5 +83,5 @@ if (uid) { --- - + diff --git a/src/pages/api/admin/ausstellen.ts b/src/pages/api/admin/ausstellen.ts index 9bbb345c..efa13051 100644 --- a/src/pages/api/admin/ausstellen.ts +++ b/src/pages/api/admin/ausstellen.ts @@ -18,6 +18,9 @@ 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({ @@ -44,59 +47,11 @@ export const GET = defineApiRoute({ | 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 +80,32 @@ 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, @@ -176,7 +129,7 @@ export const GET = defineApiRoute({ 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", }); @@ -273,5 +226,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, + } + }) + } }, }); diff --git a/src/pages/api/admin/registriernummer.ts b/src/pages/api/admin/registriernummer.ts index 02c89216..f8ceed75 100644 --- a/src/pages/api/admin/registriernummer.ts +++ b/src/pages/api/admin/registriernummer.ts @@ -7,10 +7,7 @@ import { authorizationHeaders, } from "#lib/middleware/authorization.js"; import { - BedarfsausweisWohnen, Enums, - VerbrauchsausweisGewerbe, - VerbrauchsausweisWohnen, } from "#lib/server/prisma.js"; import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; @@ -21,14 +18,14 @@ import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js"; export const GET = defineApiRoute({ input: z.object({ - uid: UUidWithPrefix, + id: UUidWithPrefix, }), headers: authorizationHeaders, middleware: adminMiddleware, - async fetch({ uid }, context, user) { - const ausweisart = getAusweisartFromId(uid); + async fetch({ id }, context, user) { + const ausweisart = getAusweisartFromId(id); const adapter = getPrismaAusweisAdapter( - uid + id ) as typeof prisma.verbrauchsausweisWohnen; if (!adapter) { @@ -40,7 +37,7 @@ export const GET = defineApiRoute({ const ausweis = await adapter.findUnique({ where: { - uid, + id, }, include: { aufnahme: { @@ -125,32 +122,27 @@ export const GET = defineApiRoute({ ? "Energiebedarfsausweis" : "Energieverbrauchsausweis"; - const body = ` - - - - ${Aussteller_ID_DIBT} - ${Aussteller_PWD_DIBT} - - - ${Ausstellungsdatum} - ${postleitzahl.bundesland} - ${postleitzahl.plz} - ${Gesetzesgrundlage} - - - ${gebaeudeart} - ${art} - ${ - ausweis.ausstellgrund === - Enums.Ausstellgrund.Neubau - ? "1" - : "0" - } - - - - `; + const requestPayload = { + doc: { + root: { + Authentifizierung: { + Aussteller_ID_DIBT: Aussteller_ID_DIBT, + Aussteller_PWD_DIBT: Aussteller_PWD_DIBT, + }, + 'EnEV-Nachweis': { + Ausstellungsdatum: Ausstellungsdatum, + Bundesland: postleitzahl.bundesland, + Postleitzahl: postleitzahl.plz, + Gesetzesgrundlage: Gesetzesgrundlage, + }, + 'Energieausweis-Daten': { + Gebaeudeart: gebaeudeart, + Art: art, + Neubau: ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau ? "1" : "0", + }, + }, + }, + } return await new Promise(async (resolve, reject) => { soap.createClient( @@ -165,7 +157,7 @@ export const GET = defineApiRoute({ } client.Datenregistratur( - body, + requestPayload, async function ( err: any, result: { @@ -193,7 +185,7 @@ export const GET = defineApiRoute({ adapter as typeof prisma.verbrauchsausweisWohnen ).update({ where: { - uid, + id, }, data: { registriernummer: diff --git a/src/pages/api/rechnung/anfordern.ts b/src/pages/api/rechnung/anfordern.ts index ffe543a4..ba1a21cf 100644 --- a/src/pages/api/rechnung/anfordern.ts +++ b/src/pages/api/rechnung/anfordern.ts @@ -51,9 +51,6 @@ export const PUT = defineApiRoute({ "message": `Ausweisart wird nicht unterstützt: ${ausweisart}` }) } - - console.log(nachweis); - if (!nachweis || nachweis.benutzer_id !== user.id) { throw new APIError({ diff --git a/src/pages/api/user/index.ts b/src/pages/api/user/index.ts index f035cc00..beb42b3c 100644 --- a/src/pages/api/user/index.ts +++ b/src/pages/api/user/index.ts @@ -3,6 +3,7 @@ import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { generatePrefixedId } from "#lib/db.js"; import { adminMiddleware, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { hashPassword } from "#lib/password.js"; +import { createLexOfficeCustomer } from "#lib/server/lexoffice.js"; import { sendRegisterMail } from "#lib/server/mail/registrierung.js"; import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; @@ -117,6 +118,17 @@ export const PUT = defineApiRoute({ } }) + const lex_office_id = await createLexOfficeCustomer(user); + + await prisma.benutzer.update({ + where: { + id: user.id + }, + data: { + lex_office_id + } + }) + await sendRegisterMail(user) return { id } diff --git a/src/pages/api/webhooks/mollie.ts b/src/pages/api/webhooks/mollie.ts index 1c3611bf..65f7990a 100644 --- a/src/pages/api/webhooks/mollie.ts +++ b/src/pages/api/webhooks/mollie.ts @@ -19,7 +19,7 @@ export const POST = defineApiRoute({ // Wir holen uns die Transaktion von Mollie. const payment = await mollieClient.payments.get(id); - const metadata = payment.metadata as { rechnung_uid: string } + const metadata = payment.metadata as { rechnung_id: string } if (!payment) { throw new APIError({ @@ -28,7 +28,7 @@ export const POST = defineApiRoute({ }); } - if (!metadata.rechnung_uid) { + if (!metadata.rechnung_id) { throw new APIError({ code: "BAD_REQUEST", message: "Rechnung UID nicht gefunden.", @@ -38,7 +38,7 @@ export const POST = defineApiRoute({ // Wir holen uns die Rechnung aus unserer Datenbank. const rechnung = await prisma.rechnung.findUnique({ where: { - uid: metadata.rechnung_uid, + id: metadata.rechnung_id, }, }); diff --git a/src/pages/dashboard/ausweise/index.astro b/src/pages/dashboard/ausweise/index.astro deleted file mode 100644 index 4a49e830..00000000 --- a/src/pages/dashboard/ausweise/index.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import UserLayout from "#layouts/DashboardLayout.astro"; -import DashboardAusweiseModule from "#modules/Dashboard/DashboardAusweiseModule.svelte"; - -import { validateAccessTokenServer } from "#server/lib/validateAccessToken"; -import { createCaller } from "src/astro-typesafe-api-caller"; - -const accessTokenValid = await validateAccessTokenServer(Astro); - -if (!accessTokenValid) { - return Astro.redirect("/auth/login") -} - -const caller = createCaller(Astro); - -const user = await caller.v1.benutzer.self(); ---- - - - - \ No newline at end of file diff --git a/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro b/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro index d5280bea..77528d1e 100644 --- a/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro +++ b/src/pages/energieausweis-erstellen/bedarfsausweis-wohngebaeude/index.astro @@ -27,7 +27,7 @@ if (id) { ausweis = await getBedarfsausweisWohnen(id) as BedarfsausweisWohnen ausweistyp = ausweis.ausweistyp; - if (!ausweis || ausweis.benutzer_id !== user.id) { + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { // Der Ausweis scheint nicht zu existieren. // Wir leiten auf die generische Ausweisseite ohne ID weiter. return Astro.redirect( diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro index ebc5b35c..744699cc 100644 --- a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro +++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro @@ -27,7 +27,7 @@ if (id) { ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe ausweistyp = ausweis.ausweistyp; - if (!ausweis || ausweis.benutzer_id !== user.id) { + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { // Der Ausweis scheint nicht zu existieren. // Wir leiten auf die generische Ausweisseite ohne ID weiter. return Astro.redirect( diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro index d2bb033c..3923b2b0 100644 --- a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro +++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro @@ -1,7 +1,6 @@ --- import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte"; -import { AufnahmeClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; import { Aufnahme, Bild, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/server/prisma"; import { getAufnahme, getBilder, getObjekt, getVerbrauchsausweisWohnen } from "#lib/server/db"; import { getCurrentUser } from "#lib/server/user"; @@ -27,7 +26,7 @@ if (id) { ausweis = await getVerbrauchsausweisWohnen(id) as VerbrauchsausweisWohnen ausweistyp = ausweis.ausweistyp; - if (!ausweis || ausweis.benutzer_id !== user.id) { + if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) { // Der Ausweis scheint nicht zu existieren. // Wir leiten auf die generische Ausweisseite ohne ID weiter. return Astro.redirect( @@ -82,5 +81,5 @@ if (id) { --- - +