e2e Tests für Verbrauchsausweis Wohnen und Gewerbe vollständig

This commit is contained in:
Moritz Utcke
2025-02-07 14:58:51 +07:00
parent 64fa120ccd
commit 829c176b50
66 changed files with 219 additions and 168 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -1,10 +1,9 @@
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, BedarfsausweisWohnenClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
import { Enums } from "@ibcornelsen/database/client";
export async function ausweisSpeichern(
@@ -65,13 +64,13 @@ export async function ausweisSpeichern(
let patchRoute: any;
let putRoute: any;
if (ausweisart = Enums.Ausweisart.VerbrauchsausweisWohnen) {
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
patchRoute = api["verbrauchsausweis-wohnen"]._uid.PATCH
putRoute = api["verbrauchsausweis-wohnen"].PUT
} else if (ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe) {
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
patchRoute = api["verbrauchsausweis-gewerbe"]._uid.PATCH
putRoute = api["verbrauchsausweis-gewerbe"].PUT
} else if (ausweisart = Enums.Ausweisart.BedarfsausweisWohnen) {
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
patchRoute = api["bedarfsausweis-wohnen"]._uid.PATCH
putRoute = api["bedarfsausweis-wohnen"].PUT
}

View File

@@ -14,27 +14,17 @@ sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
">
<!-- Anrede *
<!-- Anrede * -->
<!--
<div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="Anrede *"></Inputlabel>
<select name="anrede" bind:value={user.anrede}>
<option>bitte auswählen</option>
<option disabled selected>bitte auswählen</option>
<option value="Herr">Herr</option>
<option value="Frau">Frau</option>
<option value="Frau">Frau</option>
</select>
<div class="help-label">
<HelpLabel>
Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
Dabei handelt es sich um die Wohnfläche abzüglich
vorhandener Flächen die sich außerhalb des Gebäudes
befinden. (Balkone, Terassen,etc.).
</HelpLabel>
</div>
</div>-->
</div> -->
<!-- Vorname * -->

View File

@@ -137,14 +137,15 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
>
{#if !ausweis.zusaetzliche_heizquelle}
<input
id="zusaetzliche_heizquelle_1"
id="zusaetzliche_heizquelle"
type="checkbox"
class="checkbox"
name="zusaetzliche_heizquelle_1"
name="zusaetzliche_heizquelle"
data-cy="zusaetzliche_heizquelle"
bind:checked={ausweis.zusaetzliche_heizquelle}
/>
<label
for="zusaetzliche_heizquelle_1"
for="zusaetzliche_heizquelle"
class="cursor-pointer">zusätzliche Heizquelle</label
>
{/if}
@@ -236,6 +237,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-e-none"
name="brennstoff_1"
data-cy="brennstoff_1"
bind:value={aufnahme.brennstoff_1}
required
>
@@ -267,6 +269,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-s-none"
name="einheit_1"
data-cy="einheit_1"
bind:value={ausweis.einheit_1}
disabled={!aufnahme.brennstoff_1}
required
@@ -416,6 +419,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-e-none"
name="brennstoff_2"
data-cy="brennstoff_2"
bind:value={aufnahme.brennstoff_2}
required
>
@@ -449,6 +453,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select
class="rounded-s-none"
name="einheit_2"
data-cy="einheit_2"
bind:value={ausweis.einheit_2}
disabled={!aufnahme.brennstoff_2}
required
@@ -665,9 +670,9 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<Inputlabel title="Sonstige"></Inputlabel>
<input
name="strom_3"
name="stromverbrauch_enthaelt_sonstige"
type="number"
bind:value={ausweis.strom_3}
bind:value={ausweis.stromverbrauch_enthaelt_sonstige}
required
/>

View File

@@ -51,7 +51,11 @@ export type VerbrauchsausweisWohnenClient = OmitKeys<
export type VerbrauchsausweisGewerbeClient = OmitKeys<
VerbrauchsausweisGewerbe,
"id" | "aufnahme_id" | "benutzer_id"
>;
> & {
uid_objekt: string,
uid_aufnahme: string,
uid_benutzer?: string
};
/**
* Das ist der Typescript Type für den Verbrauchsausweis Gewerbe mit allen Feldern die
@@ -66,7 +70,11 @@ export type VerbrauchsausweisGewerbeClient = OmitKeys<
export type BedarfsausweisWohnenClient = OmitKeys<
BedarfsausweisWohnen,
"id" | "aufnahme_id" | "benutzer_id"
>;
> & {
uid_objekt: string,
uid_aufnahme: string,
uid_benutzer?: string
};
/**
* Das ist der Typescript Type für die Gebäude Stammdaten mit allen Feldern die

View File

@@ -10,7 +10,7 @@
<div>
<input type="radio" data-test={paymentType} id={paymentType} name="paymentType" on:change={() => selectedPaymentType = paymentType} />
<input type="radio" data-cy={paymentType} id={paymentType} name="paymentType" on:change={() => selectedPaymentType = paymentType} />
<label for={paymentType}>
<div class="grid grid-rows-[1fr_20px] justify-items-center items-center cursor-pointer">

View File

@@ -2,6 +2,7 @@ import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { type Enums } from "@ibcornelsen/database/client";
import "cypress-file-upload"
import moment from "moment";
describe("Verbrauchsausweis erstellen Schritt 1", () => {
const ausstellgrund = (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]);
@@ -13,15 +14,13 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.wait(1000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("input[name='ausstellgrund']")
.should("have.length", ausstellgrund.length)
.eq(
cy.get("select[data-cy='ausstellgrund']")
.select(
faker.number.int({
min: 0,
max: ausstellgrund.length - 1,
max: (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]).length - 1,
})
)
.check();
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']")
@@ -91,9 +90,22 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
let availableDates = [];
const startDate = moment()
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment().subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
availableDates.push({
year: m.year(),
month: m.month(),
});
}
// Verbrauchszeitraum
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString());
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString());
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString());
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString());
// Verbrauch
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
@@ -104,18 +116,18 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
const zusaetzlicheHeizquelle = Math.random() > 0.5;
if (zusaetzlicheHeizquelle) {
cy.get("input[name='zusaetzliche_heizquelle']").check();
cy.get("[data-cy='zusaetzliche_heizquelle']").check();
// Brennstoff und Einheit 2
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]);
cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]);
cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
// Verbrauch
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
}
// Gebäudestrom
@@ -172,7 +184,7 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
// Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
const options = $dropdown.find('option');
const options = $dropdown.find('option:not([disabled])');
// Select the option at the random index
cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
@@ -213,7 +225,7 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
if (Math.random() > 0.5) cy.get("input[name='warmwasser_rohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='heizungsrohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='zirkulation']").check();
if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
// if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
// Heizungsanlage Bilder
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
@@ -250,14 +262,14 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
// Jetzt können wir den Verbrauchsausweis erstellen.
cy.get("form[name='ausweis'] button[type='submit']").click({ force: true });
cy.get("form[name='ausweis'] button[data-cy='weiter']").click({ force: true });
// Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
// Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
cy.get("button[name='registrieren']").click();
cy.get("[data-cy='registrieren']").click();
const email = faker.internet.email();
const passwort = faker.internet.password();
const passwort = "test1234";
const vorname = faker.person.firstName();
const nachname = faker.person.lastName();
@@ -275,6 +287,37 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("form[name='login'] button[type='submit']").click();
// Der Ausweis sollte jetzt schon erstellt worden sein.
// Der Ausweis sollte jetzt schon erstellt worden sein und wir sollten auf die kundendaten seite weitergeleitet worden sein.
cy.url().should("contain", "/kundendaten");
cy.wait(1000)
// Wir füllen jetzt die Kundendaten aus.
// cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
cy.get("input[name='vorname']").should("contain.value", vorname);
cy.get("input[name='name']").should("contain.value", nachname);
// cy.get("input[name='email']").should("contain.value", email);
// cy.get("input[name='telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress());
// TODO: Random Plz generieren, allerdings muss die auch in der Datenbank vorhanden sein...
cy.get("input[name='rechnung_plz']").type("2103");
// Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an.
cy.get("div[data-test='plz-container']").children().first().click();
// cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_email']").should("contain.value", email);
cy.get("input[data-cy='paypal']").click();
// Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
// cy.get("input[name='agb-akzeptieren']").check()
// cy.get("input[name='datenschutz-akzeptieren']").check()
cy.get("button[data-cy='bestellen']").click();
cy.origin('https://www.mollie.com', () => {
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
cy.get("input[type='radio'][name='final_state'][value='paid']").check();
// Da wird unser Test fehlschlagen, da die localhost domain von Mollie aus nicht erreichbar ist.
})
});
});

View File

@@ -266,11 +266,11 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.wait(1000)
// Wir füllen jetzt die Kundendaten aus.
cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
// cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
cy.get("input[name='vorname']").should("contain.value", vorname);
cy.get("input[name='name']").should("contain.value", nachname);
cy.get("input[name='email']").should("contain.value", email);
cy.get("input[name='telefon']").type(faker.phone.number());
// cy.get("input[name='email']").should("contain.value", email);
// cy.get("input[name='telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress());
@@ -278,14 +278,14 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("input[name='rechnung_plz']").type("2103");
// Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an.
cy.get("div[data-test='plz-container']").children().first().click();
cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_email']").type(faker.internet.email());
cy.get("button[data-test='paypal']").click();
// cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_email']").should("contain.value", email);
cy.get("input[data-cy='paypal']").click();
// Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
cy.get("input[name='agb-akzeptieren']").check()
cy.get("input[name='datenschutz-akzeptieren']").check()
cy.get("button[type='submit']").click();
// cy.get("input[name='agb-akzeptieren']").check()
// cy.get("input[name='datenschutz-akzeptieren']").check()
cy.get("button[data-cy='bestellen']").click();
cy.origin('https://www.mollie.com', () => {
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus

View File

@@ -260,7 +260,7 @@
<button class="button">Speichern</button>
<button class="button" on:click={bestellen}>kostenpflichtig bestellen</button>
<button class="button" data-cy="bestellen" on:click={bestellen}>kostenpflichtig bestellen</button>
</div>

View File

@@ -26,32 +26,11 @@
export let objekt: ObjektClient = {} as ObjektClient;
export let aufnahme: AufnahmeClient = {} as AufnahmeClient;
export let bilder: UploadedGebaeudeBild[] = [];
export let ausweisart = "Verbrauchsausweis Gewerbe";
export let ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe;
function automatischAusfüllen() {}
async function spaeterWeitermachen() {
const result = await verbrauchsausweisWohnenSpeichern(
ausweis,
objekt,
aufnahme,
bilder,
user
);
if (result !== null) {
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// Sonst müsste er alles neu eingeben...
ausweis.uid = result.uid;
objekt.uid = result.objekt_uid;
aufnahme.uid = result.objekt_aufnahme_uid;
window.history.pushState(
{},
"",
`${location.pathname}?uid=${result.uid}`
);
speichernOverlayHidden = false;
}
}
</script>
@@ -72,7 +51,7 @@
<div id="progress-box" class="w-full box relative px-4 py-3 text-center order-1 2xl:order-2 self-stretch">
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
<h2 class="text-primary text-xl">{ausweisart} {PRICES.VerbrauchsausweisGewerbe[0]}</h2>
<h2 class="text-primary text-xl">Verbrauchsausweis Gewerbe {PRICES.VerbrauchsausweisGewerbe[0]}</h2>
<ProgressBar progress={0} />
</div>
@@ -82,7 +61,7 @@
<!-- TODO: Submit implementieren in externer Datei wenn Verbrauchsausweis Wohnen fertig ist -->
<form id="formInput-1" on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
<form id="formInput-1" data-cy="ausweis" name="ausweis">
<div id="formular-box" class="formular-boxen ring-0">
<ButtonSpaeterHilfe {automatischAusfüllen} {spaeterWeitermachen} />
@@ -94,7 +73,7 @@
bind:objekt
bind:aufnahme
bind:ausweis
ausweisart={ausweisart}
{ausweisart}
/>
</Bereich>

View File

@@ -1,9 +1,8 @@
import { z } from "zod";
import { Enums, RechnungSchema, prisma } from "@ibcornelsen/database/server";
import { TRPCError } from "@trpc/server";
import { BedarfsausweisWohnen, Enums, RechnungSchema, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen, prisma } from "@ibcornelsen/database/server";
import { mollieClient } from "#lib/mollie.js";
import { PaymentMethod } from "@mollie/api-client";
import { defineApiRoute } from "astro-typesafe-api/server";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import {
authorizationHeaders,
authorizationMiddleware,
@@ -51,94 +50,96 @@ export const PUT = defineApiRoute({
// TODO: Services Implementieren
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
throw new TRPCError({
code: "BAD_REQUEST",
message: "Bedarfsausweis Wohnen wird noch nicht unterstützt.",
});
ausweis = await prisma.bedarfsausweisWohnen.findUnique({
where: {
uid: ausweis_uid
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
throw new TRPCError({
code: "BAD_REQUEST",
message:
"Verbrauchsausweis Gewerbe wird noch nicht unterstützt.",
});
ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
uid: ausweis_uid
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
// Wir müssen überprüfen, ob dem Nutzer der Ausweis tatsächlich gehört.
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid: ausweis_uid,
},
});
if (!ausweis) {
throw new TRPCError({
code: "NOT_FOUND",
message: "Ausweis nicht gefunden.",
});
}
if (ausweis.benutzer_id !== user.id) {
throw new TRPCError({
code: "UNAUTHORIZED",
message: "Ausweis gehört nicht dem Nutzer.",
});
}
// Wir erstellen eine neue Rechnung in unserer Datenbank.
const rechnung = await prisma.rechnung.create({
data: {
benutzer_id: user.id,
betrag: 0,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
aufnahme_id: ausweis.aufnahme_id,
},
select: {
uid: true,
betrag: true,
},
});
if (!rechnung) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Rechnung konnte nicht erstellt werden.",
});
}
// Wir erstellen eine Mollie Payment Referenz.
const payment = await mollieClient.payments.create({
amount: {
value: "45.00",
currency: "EUR",
},
metadata: {
rechnung_uid: rechnung.uid,
},
method: input.bezahlmethode as PaymentMethod,
description: "Verbrauchsausweis Wohnen 2016",
redirectUrl: "https://ibcornelsen.de/payment/success",
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.uid}`,
});
const checkoutUrl = payment.getCheckoutUrl();
if (!checkoutUrl) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Checkout URL konnte nicht erstellt werden.",
});
}
return {
uid: rechnung.uid,
checkout_url: checkoutUrl,
};
} else {
throw new TRPCError({
throw new APIError({
code: "BAD_REQUEST",
message: "Ausweisart nicht unterstützt.",
});
}
if (!ausweis) {
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis nicht gefunden.",
});
}
if (ausweis.benutzer_id !== user.id) {
throw new APIError({
code: "UNAUTHORIZED",
message: "Ausweis gehört nicht dem Nutzer.",
});
}
// Wir erstellen eine neue Rechnung in unserer Datenbank.
const rechnung = await prisma.rechnung.create({
data: {
benutzer_id: user.id,
betrag: 0,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
aufnahme_id: ausweis.aufnahme_id,
},
select: {
uid: true,
betrag: true,
},
});
if (!rechnung) {
throw new APIError({
code: "INTERNAL_SERVER_ERROR",
message: "Rechnung konnte nicht erstellt werden.",
});
}
// Wir erstellen eine Mollie Payment Referenz.
const payment = await mollieClient.payments.create({
amount: {
value: "45.00",
currency: "EUR",
},
metadata: {
rechnung_uid: rechnung.uid,
},
method: input.bezahlmethode as PaymentMethod,
description: "Verbrauchsausweis Wohnen 2016",
redirectUrl: "https://ibcornelsen.de/payment/success",
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.uid}`,
});
const checkoutUrl = payment.getCheckoutUrl();
if (!checkoutUrl) {
throw new APIError({
code: "INTERNAL_SERVER_ERROR",
message: "Checkout URL konnte nicht erstellt werden.",
});
}
return {
uid: rechnung.uid,
checkout_url: checkoutUrl,
};
},
});

View File

@@ -6,6 +6,7 @@ import { Enums } from "@ibcornelsen/database/client";
import { createCaller } from "../astro-typesafe-api-caller";
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "#lib/constants";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import { BedarfsausweisWohnenClient, getAusweisartFromUUID, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
// Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde.
const uid = Astro.url.searchParams.get("uid");
@@ -18,14 +19,39 @@ if (!uid || !valid) {
const caller = createCaller(Astro)
const ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
})
const ausweisart = getAusweisartFromUUID(uid);
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
ausweis = await caller["verbrauchsausweis-gewerbe"]._uid.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
})
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
ausweis = await caller["bedarfsausweis-wohnen"]._uid.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
})
} else {
return Astro.redirect("/404")
}
const aufnahme = await caller.aufnahme._uid.GET.fetch(undefined, {
headers: {