From 64fa120ccd4601489737ce6c0a8b44b05a57a9d2 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Thu, 6 Feb 2025 09:32:49 +0700 Subject: [PATCH] Bezahlabschluss (Mollie) --- src/astro-typesafe-api-caller.ts | 5 +- ...WohnenSpeichern.ts => ausweisSpeichern.ts} | 27 +++- .../Ausweis/ButtonWeiterHilfe.svelte | 3 + ...ButtonZurueckSpeichernKaufabschluss.svelte | 14 -- .../Ausweis/Rechnungsadresse.svelte | 14 +- src/components/Ausweis/Verbrauch.svelte | 146 +++++++++++------- .../BedarfsausweisWohnenModule.svelte | 10 +- src/modules/KundendatenModule.svelte | 82 ++++++++-- .../VerbrauchsausweisGewerbeModule.svelte | 3 +- .../AusweisWeiter.svelte | 59 +------ .../VerbrauchsausweisWohnenModule.svelte | 83 +++++----- src/pages/api/rechnung/index.ts | 12 +- src/pages/api/webhooks/mollie.ts | 63 ++++++++ src/pages/payment/success.astro | 29 ++++ 14 files changed, 346 insertions(+), 204 deletions(-) rename src/client/lib/{verbrauchsausweisWohnenSpeichern.ts => ausweisSpeichern.ts} (66%) delete mode 100644 src/components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte create mode 100644 src/pages/api/webhooks/mollie.ts diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 72c5bd87..1ed6bb4e 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -5,13 +5,13 @@ export const createCaller = createCallerFactory({ "postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"), "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), - "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), + "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), - "rechnung": await import("../src/pages/api/rechnung/index.ts"), "objekt": await import("../src/pages/api/objekt/index.ts"), + "rechnung": await import("../src/pages/api/rechnung/index.ts"), "ticket": await import("../src/pages/api/ticket/index.ts"), "user": await import("../src/pages/api/user/index.ts"), "user/self": await import("../src/pages/api/user/self.ts"), @@ -19,6 +19,7 @@ export const createCaller = createCallerFactory({ "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), + "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"), "objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"), }) \ No newline at end of file diff --git a/src/client/lib/verbrauchsausweisWohnenSpeichern.ts b/src/client/lib/ausweisSpeichern.ts similarity index 66% rename from src/client/lib/verbrauchsausweisWohnenSpeichern.ts rename to src/client/lib/ausweisSpeichern.ts index 657fc9a5..a5cd290b 100644 --- a/src/client/lib/verbrauchsausweisWohnenSpeichern.ts +++ b/src/client/lib/ausweisSpeichern.ts @@ -4,13 +4,15 @@ 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 { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js"; +import { AufnahmeClient, BedarfsausweisWohnenClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js"; +import { Enums } from "@ibcornelsen/database/client"; -export async function verbrauchsausweisWohnenSpeichern( - ausweis: VerbrauchsausweisWohnenClient, +export async function ausweisSpeichern( + ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, objekt: ObjektClient, aufnahme: AufnahmeClient, - bilder: (UploadedGebaeudeBild & { base64?: string })[] + bilder: (UploadedGebaeudeBild & { base64?: string })[], + ausweisart: Enums.Ausweisart ) { if (objekt.uid) { await api.objekt._uid.PATCH.fetch({ @@ -61,8 +63,21 @@ export async function verbrauchsausweisWohnenSpeichern( aufnahme.uid = uid } + let patchRoute: any; + let putRoute: any; + if (ausweisart = Enums.Ausweisart.VerbrauchsausweisWohnen) { + patchRoute = api["verbrauchsausweis-wohnen"]._uid.PATCH + putRoute = api["verbrauchsausweis-wohnen"].PUT + } else if (ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe) { + patchRoute = api["verbrauchsausweis-gewerbe"]._uid.PATCH + putRoute = api["verbrauchsausweis-gewerbe"].PUT + } else if (ausweisart = Enums.Ausweisart.BedarfsausweisWohnen) { + patchRoute = api["bedarfsausweis-wohnen"]._uid.PATCH + putRoute = api["bedarfsausweis-wohnen"].PUT + } + if (ausweis.uid) { - await api["verbrauchsausweis-wohnen"]._uid.PATCH.fetch({ + await patchRoute.fetch({ ...exclude(ausweis, ["uid"]) }, { params: { @@ -73,7 +88,7 @@ export async function verbrauchsausweisWohnenSpeichern( } }) } else { - const { uid } = await api["verbrauchsausweis-wohnen"].PUT.fetch({ + const { uid } = await putRoute.fetch({ ausweis, uid_aufnahme: aufnahme.uid }, { diff --git a/src/components/Ausweis/ButtonWeiterHilfe.svelte b/src/components/Ausweis/ButtonWeiterHilfe.svelte index fcc14a64..357c5ccb 100644 --- a/src/components/Ausweis/ButtonWeiterHilfe.svelte +++ b/src/components/Ausweis/ButtonWeiterHilfe.svelte @@ -10,12 +10,14 @@ VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "./types.js"; + import { Enums } from "@ibcornelsen/database/client"; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let bilder: UploadedGebaeudeBild[]; export let user: BenutzerClient; export let objekt: ObjektClient; export let aufnahme: AufnahmeClient; + export let ausweisart: Enums.Ausweisart export let spaeterWeitermachen; @@ -38,6 +40,7 @@ bind:user bind:objekt bind:aufnahme + {ausweisart} > diff --git a/src/components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte b/src/components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte deleted file mode 100644 index 4271e054..00000000 --- a/src/components/Ausweis/ButtonZurueckSpeichernKaufabschluss.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - -
- - -
- - - - -
diff --git a/src/components/Ausweis/Rechnungsadresse.svelte b/src/components/Ausweis/Rechnungsadresse.svelte index 0ff1c4fa..8ffa6a69 100644 --- a/src/components/Ausweis/Rechnungsadresse.svelte +++ b/src/components/Ausweis/Rechnungsadresse.svelte @@ -6,19 +6,7 @@ import { BenutzerClient, RechnungClient } from "./types.js"; export let user: BenutzerClient; - - let rechnung: RechnungClient = { - email: user.email, - empfaenger: user.vorname + " " + user.name, - strasse: user.adresse, - plz: user.plz, - ort: user.ort, - versand_empfaenger: user.vorname + " " + user.name, - versand_strasse: user.adresse, - versand_plz: user.plz, - versand_ort: user.ort, - telefon: user.telefon, - }; + export let rechnung: Partial; diff --git a/src/components/Ausweis/Verbrauch.svelte b/src/components/Ausweis/Verbrauch.svelte index 0ba316a8..a81c7837 100644 --- a/src/components/Ausweis/Verbrauch.svelte +++ b/src/components/Ausweis/Verbrauch.svelte @@ -3,9 +3,6 @@ import Inputlabel from "#components/labels/InputLabel.svelte"; import Verbrauchslabel from "#components/labels/VerbrauchsLabel.svelte"; import VerbrauchsHelpLabel from "#components/labels/VerbrauchsHelpLabel.svelte"; - - import Label from "../Label.svelte"; - import moment from "moment"; import fuelList from "./brennstoffListe.js"; import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung.js"; @@ -16,7 +13,7 @@ } from "./types.js"; import { addNotification } from "#components/Notifications/shared.js"; - export let gebaeude: ObjektClient; + export let objekt: ObjektClient; export let aufnahme: AufnahmeClient; export let ausweis: VerbrauchsausweisWohnenClient; @@ -43,14 +40,13 @@ "Dezember", ]; - const startDate = moment( - aufnahme.erstellungsdatum || Date.now() - ) + const startDate = moment(aufnahme.erstellungsdatum || Date.now()) .subtract(4, "years") .subtract(6, "months"); - const endDate = moment( - aufnahme.erstellungsdatum || Date.now() - ).subtract(3, "years"); + const endDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract( + 3, + "years" + ); for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) { availableDates.push({ @@ -84,21 +80,28 @@ $: { console.log(month, year); - - if ((availableDates.filter(date => date.month === month && date.year === year).length === 0) && typeof month === "number" && typeof year === "number") { + + if ( + availableDates.filter( + (date) => date.month === month && date.year === year + ).length === 0 && + typeof month === "number" && + typeof year === "number" + ) { addNotification({ message: "Monat nicht verfügbar.", - subtext: "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.", + subtext: + "Der ausgewählte Monat ist in diesem Jahr nicht verfügbar, bitte wählen sie einen neuen Start Monat.", dismissable: true, type: "warning", timeout: 0, uid: "monat_nicht_verfuegbar", - selector: "select[name='energieverbrauch_zeitraum_monat']" - }) + selector: "select[name='energieverbrauch_zeitraum_monat']", + }); } } - $: abweichung = auditVerbrauchAbweichung(ausweis, gebaeude); + $: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
- Sie haben die Möglichkeit neben der Hauptheizung die Verbräuche weiterer Heizquellen - (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben. - Dazu setzen Sie den Haken bei zusätzlicher Heizquelle. Eine weiterer Bereich zur Eingabe der - Verbräuche öffnet sich dann. + Sie haben die Möglichkeit neben der Hauptheizung die Verbräuche weiterer Heizquellen + (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel + etc.) einzugeben. Dazu setzen Sie den Haken bei zusätzlicher Heizquelle. + Eine weiterer Bereich zur Eingabe der Verbräuche öffnet sich dann.
@@ -189,10 +196,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie hier den Startmonat der ersten Verbrauchsperiode ein. Es sind nur Monate auswählbar, - die im zulässigen Zeitraum (Endzeitpunkt von Jahr 3 darf nicht älter als 18 Monate sein) liegen. Wählen Sie ein - aktuellerses Jahr um alle Monate zu sehen. - + Bitte geben Sie hier den Startmonat der ersten Verbrauchsperiode ein. Es sind nur Monate auswählbar, die im zulässigen Zeitraum + (Endzeitpunkt von Jahr 3 darf nicht älter als 18 Monate sein) + liegen. Wählen Sie ein aktuellerses Jahr um alle Monate zu sehen. +
@@ -218,8 +228,12 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie das Startjahr der ersten Verbrauchsperiode ein. Weitere Zeitangaben müssen nichht - gemacht werden, da alle 3 Verbrauchsjahre zusammenhängend sein sollen. + Bitte geben Sie das Startjahr der ersten Verbrauchsperiode ein. Weitere Zeitangaben müssen nichht gemacht werden, da alle + 3 Verbrauchsjahre zusammenhängend sein sollen.
@@ -244,16 +258,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Heizöl: Flüssiger fossiler Brennstoff.
- Erdgas: Gasförmiger fossiler Brennstoff.
- Flüssiggas: Wie Erdgas fossiler Brennstoff - im Flüssiggastank gelagert
- Braunkohle: Fester fossiler Brennstoff
- Holz-Pellets: Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff
- Holzhackschnitzel:Wie Holz-Pellets
- Fernwärme, Nahwärme: kommunales Wärmenetz - erfragen Sie - den Primärenergiefaktor bei Ihrem Energieversorger (meistens mit regenartivem Anteil)
- Strommix: Meist bei Wärmepumpe oder Nachtspeicher.
- Koks: stark kohlenstoffhaltiger fossiler Brennstoff.
+ Heizöl: Flüssiger fossiler Brennstoff.
+ Erdgas: Gasförmiger fossiler Brennstoff.
+ Flüssiggas: Wie Erdgas fossiler Brennstoff - im + Flüssiggastank gelagert
+ Braunkohle: Fester fossiler Brennstoff
+ Holz-Pellets: Stäbchenförmige Pellets - erneuerbarer + (nachwachsender) Brennstoff
+ Holzhackschnitzel:Wie Holz-Pellets
+ Fernwärme, Nahwärme: kommunales Wärmenetz - + erfragen Sie den Primärenergiefaktor bei Ihrem + Energieversorger + (meistens mit regenartivem Anteil)
+ Strommix: Meist bei Wärmepumpe oder Nachtspeicher.
+ Koks: stark kohlenstoffhaltiger fossiler Brennstoff.
@@ -276,9 +298,10 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an. - Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in - Litern vor. Pellets oder Brennholz in kg. + Bitte geben Sie die Einheit ein. Die Liste passt sich + entsprechend des ausgeählten Brennstoffes an. Erdgas wird + meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt + meistens in Litern vor. Pellets oder Brennholz in kg.
@@ -397,8 +420,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Hier sind die Verbräuche einer zusätzlichen Heizquelle - (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel etc.) einzugeben + Hier sind die Verbräuche einer zusätzlichen Heizquelle + (z.B. Einzelöfen, Kamin, Nachtspeicher, Wärmepumpe, zweiter Heizkessel + etc.) einzugeben
@@ -427,16 +455,24 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Heizöl: Flüssiger fossiler Brennstoff.
- Erdgas: Gasförmiger fossiler Brennstoff.
- Flüssiggas: Wie Erdgas fossiler Brennstoff - im Flüssiggastank gelagert
- Braunkohle: Fester fossiler Brennstoff
- Holz-Pellets: Stäbchenförmige Pellets - erneuerbarer (nachwachsender) Brennstoff
- Holzhackschnitzel:Wie Holz-Pellets
- Fernwärme, Nahwärme: kommunales Wärmenetz - erfragen Sie - den Primärenergiefaktor bei Ihrem Energieversorger (meistens mit regenartivem Anteil)
- Strommix: Meist bei Wärmepumpe oder Nachtspeicher.
- Koks: stark kohlenstoffhaltiger fossiler Brennstoff.
+ Heizöl: Flüssiger fossiler Brennstoff.
+ Erdgas: Gasförmiger fossiler Brennstoff.
+ Flüssiggas: Wie Erdgas fossiler Brennstoff - im + Flüssiggastank gelagert
+ Braunkohle: Fester fossiler Brennstoff
+ Holz-Pellets: Stäbchenförmige Pellets - + erneuerbarer (nachwachsender) Brennstoff
+ Holzhackschnitzel:Wie Holz-Pellets
+ Fernwärme, Nahwärme: kommunales Wärmenetz - + erfragen Sie den Primärenergiefaktor bei Ihrem + Energieversorger + (meistens mit regenartivem Anteil)
+ Strommix: Meist bei Wärmepumpe oder + Nachtspeicher.
+ Koks: stark kohlenstoffhaltiger fossiler + Brennstoff.
@@ -462,9 +498,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- Bitte geben Sie die Einheit ein. Die Liste passt sich entsprechend des ausgeählten Brennstoffes an. - Erdgas wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl liegt meistens in - Litern vor. Pellets oder Brennholz in kg. + Bitte geben Sie die Einheit ein. Die Liste passt sich + entsprechend des ausgeählten Brennstoffes an. Erdgas + wird meist auf der Abrechnung in kWh ausgewiesen. Heizöl + liegt meistens in Litern vor. Pellets oder Brennholz in + kg.
diff --git a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte index 3a0b7036..33184d2e 100644 --- a/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte +++ b/src/modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte @@ -159,7 +159,8 @@ } -
-
-
@@ -1009,8 +1008,9 @@ title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgesc bind:ausweis bind:images bind:user - bind:gebaeude - bind:gebaeude_aufnahme_allgemein + bind:objekt + bind:aufnahme + ausweisart={Enums.Ausweisart.BedarfsausweisWohnen} > = { + email: user.email, + empfaenger: user.vorname + " " + user.name, + strasse: user.adresse, + plz: user.plz, + ort: user.ort, + versand_empfaenger: user.vorname + " " + user.name, + versand_strasse: user.adresse, + versand_plz: user.plz, + versand_ort: user.ort, + telefon: user.telefon, + } + + let services: { name: string, id: Enums.Service, price: number, selected: boolean }[] = [ { name: "Qualitätsdruck per Post (zusätzlich zur PDF Version)", id: Enums.Service.Qualitaetsdruck, @@ -54,7 +71,7 @@ }, ]; - export let selectedPaymentType: Bezahlmethoden = + export let bezahlmethode: Bezahlmethoden = Enums.Bezahlmethoden.paypal; let prices: number[] = []; @@ -93,6 +110,38 @@ window.location.href = `/kaufabschluss?uid=${ausweis.uid}`; } + + async function bestellen() { + const ausweisart = getAusweisartFromUUID(ausweis.uid) as Enums.Ausweisart; + + try { + const { uid, checkout_url } = await api.rechnung.PUT.fetch({ + ausweisart, + bezahlmethode, + services: services.filter(service => service.selected).map(service => service.id), + email: rechnung.email, + empfaenger: rechnung.empfaenger, + strasse: rechnung.strasse, + plz: rechnung.plz, + ort: rechnung.ort, + versand_empfaenger: rechnung.versand_empfaenger, + versand_strasse: rechnung.versand_strasse, + versand_plz: rechnung.versand_plz, + versand_ort: rechnung.versand_ort, + telefon: rechnung.telefon, + ausweis_uid: ausweis.uid + }, { + headers: { + Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` + } + }) + + window.location.href = checkout_url; + } catch(e) { + console.log(e); + + } + }
- +
- -
@@ -193,8 +242,8 @@
:
{selectedPaymentType}
@@ -202,7 +251,18 @@
- +
+ + +
+ + + + +
+
- +