From 0b93b2d230e9dba65026d22177c281f5c0148ef3 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Wed, 12 Mar 2025 16:21:27 -0300 Subject: [PATCH] GEG Nachweis Gewerbe --- .../20250312191621_gng/migration.sql | 47 ++++++ prisma/schema/GEGNachweisGewerbe.prisma | 2 +- src/astro-typesafe-api-caller.ts | 8 +- src/client/lib/nachweisSpeichern.ts | 141 ++++++++++++++---- src/components/Ausweis/Ausweisart.svelte | 6 +- .../Ausweis/ButtonWeiterHilfe.svelte | 2 +- .../GEGNachweis/GEGAusweisart.svelte | 2 +- .../e2e/GEGNachweisGewerbe/erstellen.cy.ts | 134 +++++++++++++++++ src/modules/KundendatenModule.svelte | 19 +-- .../GEGNachweisGewerbeModule.svelte | 124 ++++++++++----- .../GEGNachweisWohnenModule.svelte | 121 +++++++++------ .../geg-nachweis-wohnen-anfragen/index.astro | 4 +- src/pages/api/aufnahme/index.ts | 3 +- src/pages/api/geg-nachweis-gewerbe/index.ts | 5 +- src/pages/api/geg-nachweis-wohnen/index.ts | 7 +- src/pages/api/rechnung/anfordern.ts | 56 +++++-- src/pages/kundendaten.astro | 2 +- 17 files changed, 526 insertions(+), 157 deletions(-) create mode 100644 prisma/migrations/20250312191621_gng/migration.sql create mode 100644 src/cypress/e2e/GEGNachweisGewerbe/erstellen.cy.ts diff --git a/prisma/migrations/20250312191621_gng/migration.sql b/prisma/migrations/20250312191621_gng/migration.sql new file mode 100644 index 00000000..d6f2e9e5 --- /dev/null +++ b/prisma/migrations/20250312191621_gng/migration.sql @@ -0,0 +1,47 @@ +-- AlterTable +ALTER TABLE "Anteilshaber" ALTER COLUMN "uid" SET DEFAULT 'ant-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "Aufnahme" ALTER COLUMN "uid" SET DEFAULT 'auf-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "BedarfsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'bag-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'baw-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "Bild" ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "Event" ALTER COLUMN "uid" SET DEFAULT 'evt-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "GEGEinpreisung" ALTER COLUMN "uid" SET DEFAULT 'gge-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "GEGNachweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'gng-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "GEGNachweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "Objekt" ALTER COLUMN "uid" SET DEFAULT 'obj-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "Rechnung" ALTER COLUMN "uid" SET DEFAULT 'inv-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "Tickets" ALTER COLUMN "uid" SET DEFAULT 'tkt-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "Unterlage" ALTER COLUMN "uid" SET DEFAULT 'pln-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "VerbrauchsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'vag-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "VerbrauchsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'vaw-' || gen_random_uuid(); + +-- AlterTable +ALTER TABLE "benutzer" ALTER COLUMN "uid" SET DEFAULT 'usr-' || gen_random_uuid(); diff --git a/prisma/schema/GEGNachweisGewerbe.prisma b/prisma/schema/GEGNachweisGewerbe.prisma index 236e5824..cdcb9bdf 100644 --- a/prisma/schema/GEGNachweisGewerbe.prisma +++ b/prisma/schema/GEGNachweisGewerbe.prisma @@ -1,6 +1,6 @@ model GEGNachweisGewerbe { id Int @id @default(autoincrement()) - uid String @unique @default(dbgenerated("'gnw-' || gen_random_uuid()")) + uid String @unique @default(dbgenerated("'gng-' || gen_random_uuid()")) /// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf") ausstellgrund Ausstellgrund? diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index cf94b56b..cce5b331 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -12,13 +12,13 @@ export const createCaller = createCallerFactory({ "admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"), "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), - "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), + "ausweise": await import("../src/pages/api/ausweise/index.ts"), "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), - "ausweise": await import("../src/pages/api/ausweise/index.ts"), + "aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "geg-nachweis-gewerbe/[uid]": await import("../src/pages/api/geg-nachweis-gewerbe/[uid].ts"), "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"), @@ -31,10 +31,10 @@ export const createCaller = createCallerFactory({ "ticket": await import("../src/pages/api/ticket/index.ts"), "user": await import("../src/pages/api/user/index.ts"), "user/self": await import("../src/pages/api/user/self.ts"), - "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), - "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"), + "verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"), + "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"), "aufnahme/[uid]/bilder": await import("../src/pages/api/aufnahme/[uid]/bilder.ts"), "aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid]/index.ts"), diff --git a/src/client/lib/nachweisSpeichern.ts b/src/client/lib/nachweisSpeichern.ts index 59b2deda..082383bf 100644 --- a/src/client/lib/nachweisSpeichern.ts +++ b/src/client/lib/nachweisSpeichern.ts @@ -16,7 +16,11 @@ export async function nachweisSpeichern( ) { if (objekt.uid) { await api.objekt._uid.PATCH.fetch({ - ...exclude(objekt, ["uid"]) + adresse: objekt.adresse, + latitude: 0, + longitude: 0, + ort: objekt.ort, + plz: objekt.plz }, { params: { uid: objekt.uid @@ -27,7 +31,11 @@ export async function nachweisSpeichern( }) } else { const { uid } = await api.objekt.PUT.fetch({ - ...exclude(objekt, ["uid"]) + adresse: objekt.adresse, + latitude: 0, + longitude: 0, + ort: objekt.ort, + plz: objekt.plz }, { headers: { "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` @@ -41,10 +49,58 @@ export async function nachweisSpeichern( if (aufnahme.uid) { await api.aufnahme._uid.PATCH.fetch({ - ...exclude(aufnahme, ["uid"]), baujahr_gebaeude: aufnahme.baujahr_gebaeude || [], - baujahr_klima: aufnahme.baujahr_klima || [], baujahr_heizung: aufnahme.baujahr_heizung || [], + baujahr_klima: aufnahme.baujahr_klima || [], + alternative_heizung: aufnahme.alternative_heizung, + alternative_kuehlung: aufnahme.alternative_kuehlung, + alternative_lueftung: aufnahme.alternative_lueftung, + alternative_warmwasser: aufnahme.alternative_warmwasser, + aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, + aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, + ausweisart: aufnahme.ausweisart, + brennstoff_1: aufnahme.brennstoff_1, + brennstoff_2: aufnahme.brennstoff_2, + brennwert_kessel: aufnahme.brennwert_kessel, + dachgeschoss: aufnahme.dachgeschoss, + dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, + dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, + doppel_verglasung: aufnahme.doppel_verglasung, + dreifach_verglasung: aufnahme.dreifach_verglasung, + durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, + einfach_verglasung: aufnahme.einfach_verglasung, + einheiten: aufnahme.einheiten, + einzelofen: aufnahme.einzelofen, + energieeffizienzklasse: aufnahme.energieeffizienzklasse, + fenster_dicht: aufnahme.fenster_dicht, + fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, + flaeche: aufnahme.flaeche, + gebaeudeteil: aufnahme.gebaeudeteil, + gebaeudetyp: aufnahme.gebaeudetyp, + heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, + isolier_verglasung: aufnahme.isolier_verglasung, + keller: aufnahme.keller, + keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, + keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, + kuehlung: aufnahme.kuehlung, + leerstand: aufnahme.leerstand, + lueftung: aufnahme.lueftung, + niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, + nutzflaeche: aufnahme.nutzflaeche, + oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, + oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, + photovoltaik: aufnahme.photovoltaik, + raum_temperatur_regler: aufnahme.raum_temperatur_regler, + rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, + saniert: aufnahme.saniert, + solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, + standard_kessel: aufnahme.standard_kessel, + tueren_dicht: aufnahme.tueren_dicht, + tueren_undicht: aufnahme.tueren_undicht, + waermepumpe: aufnahme.waermepumpe, + warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, + zentralheizung: aufnahme.zentralheizung, + zirkulation: aufnahme.zirkulation }, { params: { uid: aufnahme.uid @@ -55,7 +111,61 @@ export async function nachweisSpeichern( }) } else { const { uid } = await api.aufnahme.PUT.fetch({ - aufnahme, + aufnahme: { + baujahr_gebaeude: aufnahme.baujahr_gebaeude, + baujahr_heizung: aufnahme.baujahr_heizung, + alternative_heizung: aufnahme.alternative_heizung, + alternative_kuehlung: aufnahme.alternative_kuehlung, + alternative_lueftung: aufnahme.alternative_lueftung, + alternative_warmwasser: aufnahme.alternative_warmwasser, + aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, + aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, + ausweisart: aufnahme.ausweisart, + baujahr_klima: aufnahme.baujahr_klima, + brennstoff_1: aufnahme.brennstoff_1, + brennstoff_2: aufnahme.brennstoff_2, + brennwert_kessel: aufnahme.brennwert_kessel, + dachgeschoss: aufnahme.dachgeschoss, + dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, + dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt, + doppel_verglasung: aufnahme.doppel_verglasung, + dreifach_verglasung: aufnahme.dreifach_verglasung, + durchlauf_erhitzer: aufnahme.durchlauf_erhitzer, + einfach_verglasung: aufnahme.einfach_verglasung, + einheiten: aufnahme.einheiten, + einzelofen: aufnahme.einzelofen, + energieeffizienzklasse: aufnahme.energieeffizienzklasse, + erstellungsdatum: aufnahme.erstellungsdatum, + fenster_dicht: aufnahme.fenster_dicht, + fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, + flaeche: aufnahme.flaeche, + gebaeudeteil: aufnahme.gebaeudeteil, + gebaeudetyp: aufnahme.gebaeudetyp, + heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt, + isolier_verglasung: aufnahme.isolier_verglasung, + keller: aufnahme.keller, + keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt, + keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt, + kuehlung: aufnahme.kuehlung, + leerstand: aufnahme.leerstand, + lueftung: aufnahme.lueftung, + niedertemperatur_kessel: aufnahme.niedertemperatur_kessel, + nutzflaeche: aufnahme.nutzflaeche, + oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt, + oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt, + photovoltaik: aufnahme.photovoltaik, + raum_temperatur_regler: aufnahme.raum_temperatur_regler, + rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt, + saniert: aufnahme.saniert, + solarsystem_warmwasser: aufnahme.solarsystem_warmwasser, + standard_kessel: aufnahme.standard_kessel, + tueren_dicht: aufnahme.tueren_dicht, + tueren_undicht: aufnahme.tueren_undicht, + waermepumpe: aufnahme.waermepumpe, + warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt, + zentralheizung: aufnahme.zentralheizung, + zirkulation: aufnahme.zirkulation + }, uid_objekt: objekt.uid }, { headers: { @@ -114,25 +224,4 @@ export async function nachweisSpeichern( uid_aufnahme: aufnahme.uid, uid_objekt: objekt.uid } - - - // await client.v1.tickets.erstellen.mutate({ - // titel: "Ausweis konnte nicht gespeichert werden", - // beschreibung: e.stack, - // email: user.email ?? "", - // metadata: JSON.stringify({ - // ausweis, - // }), - // }); - - // addNotification({ - // dismissable: false, - // message: - // "Ausweis konnte nicht gespeichert werden, bitte versuchen sie es erneut.", - // subtext: - // "Sollte das Problem weiterhin bestehen, kontaktieren sie bitte den Support.", - // timeout: 6000, - // type: "error", - // }); - return null; } diff --git a/src/components/Ausweis/Ausweisart.svelte b/src/components/Ausweis/Ausweisart.svelte index 7cdf51a5..0084a7f2 100644 --- a/src/components/Ausweis/Ausweisart.svelte +++ b/src/components/Ausweis/Ausweisart.svelte @@ -24,6 +24,8 @@ export let aufnahme: AufnahmeClient; export let ausweisart: Enums.Ausweisart; + + export let ausstellgrund: string[] = Object.values(Enums.Ausstellgrund);
- {#each Object.entries(Enums.Ausstellgrund) as [name, ausstellgrund]} - + {#each ausstellgrund as name} + {/each} diff --git a/src/components/Ausweis/ButtonWeiterHilfe.svelte b/src/components/Ausweis/ButtonWeiterHilfe.svelte index 95f606a9..635c412e 100644 --- a/src/components/Ausweis/ButtonWeiterHilfe.svelte +++ b/src/components/Ausweis/ButtonWeiterHilfe.svelte @@ -69,7 +69,7 @@ loginOverlayHidden = true - let result: Awaited> | null = null; + let result: Awaited> | Awaited> | null = null; if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) { result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) } else { diff --git a/src/components/GEGNachweis/GEGAusweisart.svelte b/src/components/GEGNachweis/GEGAusweisart.svelte index 53a1dbdd..4ab40b59 100644 --- a/src/components/GEGNachweis/GEGAusweisart.svelte +++ b/src/components/GEGNachweis/GEGAusweisart.svelte @@ -284,4 +284,4 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
- + \ No newline at end of file diff --git a/src/cypress/e2e/GEGNachweisGewerbe/erstellen.cy.ts b/src/cypress/e2e/GEGNachweisGewerbe/erstellen.cy.ts new file mode 100644 index 00000000..af5013c6 --- /dev/null +++ b/src/cypress/e2e/GEGNachweisGewerbe/erstellen.cy.ts @@ -0,0 +1,134 @@ +import fuelList from "#components/Ausweis/brennstoffListe.js"; +import { faker } from "@faker-js/faker"; +import { Enums } from "#lib/client/prisma.js"; + + +import "cypress-file-upload" +import moment from "moment"; + +describe("Verbrauchsausweis erstellen Schritt 1", () => { + it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => { + cy.visit("/angebot-anfragen/geg-nachweis-gewerbe-anfragen"); + + cy.wait(2000); + + // Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind. + cy.get("select[data-cy='ausstellgrund']") + .select( + faker.number.int({ + min: 1, + max: [Enums.Ausstellgrund.Modernisierung, Enums.Ausstellgrund.Neubau].length - 1, + }) + ) + + // Gebäudetyp + cy.get("select[name='gebaeudetyp']").then(($dropdown) => { + const options = $dropdown.find('option'); + // 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); + }); + + // Sanierungsstatus + cy.get("select[name='saniert']").select( + Math.random() > 0.5 ? "true" : "false" + ); + + // Jetzt Füllen wir das Baujahr vom Gebäude aus. + cy.get("input[name='baujahr_gebaeude']") + .should("have.attr", "type", "number") + .type( + faker.number.int({ min: 1900, max: 2021 }).toString() + + "{enter}", + { delay: 50 } + ); + + // Jetzt Füllen wir das Baujahr der Heizung aus. + cy.get("input[name='baujahr_heizung']") + .should("have.attr", "type", "number") + .type( + faker.number.int({ min: 1900, max: 2021 }).toString() + + "{enter}", + { delay: 50 } + ); + + // Adresse + cy.get("input[name='adresse']").type(faker.location.streetAddress()); + + // Postleitzahl + cy.get("input[name='plz']").type( + faker.location.zipCode({ + format: "#####", + }) + ); + + // TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist. + cy.get("[data-cy='plz-container']").find("button").first().click() + + // Nutzflaeche + cy.get("input[name='nutzflaeche']") + .should("have.attr", "type", "number") + .type(faker.number.int({ min: 50, max: 1000 }).toString()); + + // Keller + cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({ + max: Object.values(Enums.Heizungsstatus).length, + min: 1 + })); + + // Dachgeschoss + cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({ + max: Object.values(Enums.Heizungsstatus).length, + min: 1 + })); + + cy.get("[data-cy='beschreibung']").type(faker.lorem.paragraphs({ min: 2, max: 10 })) + + // Wärmedämmung Bilder + cy.get("input[type='file'][name='plaene']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" }).attachFile("images/daemmung/2.jpeg", { subjectType: "input" }); + cy.get("input[type='file'][name='unterlagen']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" }).attachFile("images/daemmung/2.jpeg", { subjectType: "input" }); + + // Jetzt können wir den Verbrauchsausweis erstellen. + cy.get("form[data-cy='nachweis'] button[data-cy='weiter']").click({ force: true }); + + cy.url().should("contain", "/kundendaten"); + + const email = faker.internet.email(); + const passwort = "test1234"; + const vorname = faker.person.firstName(); + const nachname = faker.person.lastName(); + const telefon = faker.phone.number() + + const strasse = faker.location.streetAddress({ useFullAddress: true }) + const plz = faker.location.zipCode("#####") + + cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname); + cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname); + cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon); + // Rechnung + cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`); + cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse); + cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz); + cy.get("[data-cy='plz-container']").children().first().click() + cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email); + + cy.get("button[data-cy='bestellen']").click(); + + cy.get("a[data-cy='registrieren']").should("be.visible").click(); + + // Wir sind jetzt registriert und können uns nun einloggen. + // Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben. + cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname); + cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname); + cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email); + cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort); + + cy.get("form[name='signup'] button[type='submit']").click(); + cy.get("form[name='login'] button[type='submit']").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. + }) + }); +}); diff --git a/src/modules/KundendatenModule.svelte b/src/modules/KundendatenModule.svelte index 77288a27..15169335 100644 --- a/src/modules/KundendatenModule.svelte +++ b/src/modules/KundendatenModule.svelte @@ -153,27 +153,24 @@ } if (!await validateAccessTokenClient()) { - loginAction = bestellen + loginAction = anfordern loginOverlayHidden = false; return } loginOverlayHidden = true - let result: Awaited> | null = null; + let result: Awaited> | null = null; try { - if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) { - result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) - } else { - result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart) - } + result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) } catch(e) { addNotification({ dismissable: true, message: "Ups... Das hat nicht geklappt.", subtext: "Speichern ist fehlgeschlagen, bitte versuchen sie es erneut oder kontaktieren sie unseren Support." }) + return; } try { @@ -189,7 +186,7 @@ versand_plz: $versand_plz, versand_ort: $versand_ort, telefon: $telefon, - nachweis_uid: ausweis.uid, + nachweis_uid: result.uid_nachweis, }, { headers: { @@ -201,7 +198,7 @@ // Alle alten Ausweisdateien im localStorage löschen. localStorage.clear(); - window.location.href = `/einpreisung/success?e=${uid}&a=${ausweis.uid}`; + window.location.href = `/einpreisung/success?e=${uid}&a=${result.uid_nachweis}`; } catch (e) { addNotification({ dismissable: true, @@ -220,7 +217,7 @@ loginOverlayHidden = true - let result: Awaited> | null = null; + let result: Awaited> | Awaited> | null = null; try { if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) { result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) @@ -267,7 +264,7 @@ loginOverlayHidden = true - let result: Awaited> | null = null; + let result: Awaited> | Awaited> | null = null; if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) { result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart) } else { diff --git a/src/modules/angebot-anfragen/GEGNachweisGewerbeModule.svelte b/src/modules/angebot-anfragen/GEGNachweisGewerbeModule.svelte index 4ad89f39..608acdde 100644 --- a/src/modules/angebot-anfragen/GEGNachweisGewerbeModule.svelte +++ b/src/modules/angebot-anfragen/GEGNachweisGewerbeModule.svelte @@ -10,87 +10,124 @@ GEGNachweisWohnenClient, } from "#components/Ausweis/types.js"; import Bereich from "#components/labels/Bereich.svelte"; - import { Enums } from "#lib/client/prisma"; + import { Enums } from "#lib/client/prisma.js"; import InputLabel from "#components/labels/InputLabel.svelte"; import HelpLabel from "#components/labels/HelpLabel.svelte"; import Progressbar from "#components/Ausweis/Progressbar.svelte"; import FileGrid from "#components/FileGrid.svelte"; import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte"; - export let nachweis: GEGNachweisWohnenClient; export let objekt: ObjektClient; export let aufnahme: AufnahmeClient; export let user: BenutzerClient = {} as BenutzerClient; export let bilder: UploadedGebaeudeBild[] = []; - export let plaene: UnterlageClient[] = - []; + export let plaene: UnterlageClient[] = []; export let unterlagen: UnterlageClient[] = []; if (Object.keys(nachweis).length === 0) { - const localStorageAusweis = localStorage.getItem("ausweis"); + const localStorageAusweis = localStorage.getItem( + "geg-nachweis-gewerbe.ausweis" + ); if (localStorageAusweis) { - nachweis = JSON.parse(localStorageAusweis) + nachweis = JSON.parse(localStorageAusweis); } } if (Object.keys(aufnahme).length === 0) { - const localStorageAufnahme = localStorage.getItem("aufnahme"); + const localStorageAufnahme = localStorage.getItem( + "geg-nachweis-gewerbe.aufnahme" + ); if (localStorageAufnahme) { - aufnahme = JSON.parse(localStorageAufnahme) + aufnahme = JSON.parse(localStorageAufnahme); } } if (Object.keys(objekt).length === 0) { - const localStorageObjekt = localStorage.getItem("objekt"); + const localStorageObjekt = localStorage.getItem( + "geg-nachweis-gewerbe.objekt" + ); if (localStorageObjekt) { - objekt = JSON.parse(localStorageObjekt) + objekt = JSON.parse(localStorageObjekt); } } if (Object.keys(bilder).length === 0) { - const localStorageBilder = localStorage.getItem("bilder"); + const localStorageBilder = localStorage.getItem( + "geg-nachweis-gewerbe.bilder" + ); if (localStorageBilder) { - bilder = JSON.parse(localStorageBilder) + bilder = JSON.parse(localStorageBilder); } } if (Object.keys(unterlagen).length === 0) { - const localStorageUnterlagen = localStorage.getItem("unterlagen"); + const localStorageUnterlagen = localStorage.getItem( + "geg-nachweis-gewerbe.unterlagen" + ); if (localStorageUnterlagen) { - unterlagen = JSON.parse(localStorageUnterlagen) + unterlagen = JSON.parse(localStorageUnterlagen); } } - $: { - localStorage.setItem("ausweis", JSON.stringify(nachweis)) - localStorage.setItem("aufnahme", JSON.stringify(aufnahme)) - localStorage.setItem("objekt", JSON.stringify(objekt)) - localStorage.setItem("bilder", JSON.stringify(bilder)) - localStorage.setItem("unterlagen", JSON.stringify(unterlagen)) + localStorage.setItem( + "geg-nachweis-gewerbe.ausweis", + JSON.stringify(nachweis) + ); + localStorage.setItem( + "geg-nachweis-gewerbe.aufnahme", + JSON.stringify(aufnahme) + ); + localStorage.setItem( + "geg-nachweis-gewerbe.objekt", + JSON.stringify(objekt) + ); + localStorage.setItem( + "geg-nachweis-gewerbe.bilder", + JSON.stringify(bilder) + ); + localStorage.setItem( + "geg-nachweis-gewerbe.unterlagen", + JSON.stringify(unterlagen) + ); } const ausweisart = Enums.Ausweisart.GEGNachweisGewerbe; const anliegen = "Angebot anfragen"; + + let skala: HTMLDivElement; + let form: HTMLFormElement; -
- - - +
+
-
+
- + @@ -108,7 +145,12 @@ title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw." > - +
@@ -181,14 +223,14 @@
- - + bind:ausweis={nachweis} + bind:bilder + bind:unterlagen + bind:user + bind:objekt + bind:aufnahme + ausweisart={Enums.Ausweisart.GEGNachweisGewerbe} + {form} + {skala} + > diff --git a/src/modules/angebot-anfragen/GEGNachweisWohnenModule.svelte b/src/modules/angebot-anfragen/GEGNachweisWohnenModule.svelte index 6b8c0ae3..2d05d14e 100644 --- a/src/modules/angebot-anfragen/GEGNachweisWohnenModule.svelte +++ b/src/modules/angebot-anfragen/GEGNachweisWohnenModule.svelte @@ -1,13 +1,12 @@ -
- - - -
- -
+ +
+ +
- + @@ -112,7 +141,11 @@ title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw." > - +
@@ -185,16 +218,14 @@
- - + bind:ausweis={nachweis} + bind:bilder + bind:unterlagen + bind:user + bind:objekt + bind:aufnahme + ausweisart={Enums.Ausweisart.GEGNachweisWohnen} + {form} + {skala} + > diff --git a/src/pages/angebot-anfragen/geg-nachweis-wohnen-anfragen/index.astro b/src/pages/angebot-anfragen/geg-nachweis-wohnen-anfragen/index.astro index b96d11b4..e8718bea 100644 --- a/src/pages/angebot-anfragen/geg-nachweis-wohnen-anfragen/index.astro +++ b/src/pages/angebot-anfragen/geg-nachweis-wohnen-anfragen/index.astro @@ -1,6 +1,6 @@ --- import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; -import { AufnahmeClient, GEGNachweisWohnenClient, ObjektClient, UnterlageClient, UploadedGebaeudeBild } from "#components/Ausweis/types"; +import { AufnahmeClient, BildClient, GEGNachweisWohnenClient, ObjektClient, UnterlageClient } from "#components/Ausweis/types"; import { createCaller } from "src/astro-typesafe-api-caller"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js"; @@ -10,7 +10,7 @@ const uid = Astro.url.searchParams.get("uid"); let nachweis: GEGNachweisWohnenClient = {} as GEGNachweisWohnenClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient; let objekt: ObjektClient = {} as ObjektClient; -let bilder: UploadedGebaeudeBild[] = [] +let bilder: BildClient[] = [] let unterlagen: UnterlageClient[] = [] const valid = validateAccessTokenServer(Astro); diff --git a/src/pages/api/aufnahme/index.ts b/src/pages/api/aufnahme/index.ts index 439fe1ff..1c54363f 100644 --- a/src/pages/api/aufnahme/index.ts +++ b/src/pages/api/aufnahme/index.ts @@ -1,7 +1,8 @@ import { UUidWithPrefix } from "#components/Ausweis/types.js" import { authorizationMiddleware } from "#lib/middleware/authorization.js" -import { AufnahmeSchema, ObjektSchema, prisma } from "#lib/server/prisma.js" +import { prisma } from "#lib/server/prisma.js" import { APIError, defineApiRoute } from "astro-typesafe-api/server" +import { AufnahmeSchema } from "src/generated/zod/aufnahme.js" import { z } from "zod" export const PUT = defineApiRoute({ diff --git a/src/pages/api/geg-nachweis-gewerbe/index.ts b/src/pages/api/geg-nachweis-gewerbe/index.ts index aebdbefc..612350a0 100644 --- a/src/pages/api/geg-nachweis-gewerbe/index.ts +++ b/src/pages/api/geg-nachweis-gewerbe/index.ts @@ -1,7 +1,8 @@ import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; -import { GEGNachweisGewerbeSchema, GEGNachweisWohnenSchema, prisma } from "#lib/server/prisma"; +import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; +import { GEGNachweisGewerbeSchema } from "src/generated/zod/gegnachweisgewerbe.js"; import { z } from "zod"; export const PUT = defineApiRoute({ @@ -18,6 +19,7 @@ export const PUT = defineApiRoute({ uid: true, aufnahme_id: true, geg_einpreisung_id: true, + rechnung_id: true }), uid_aufnahme: UUidWithPrefix }), @@ -109,7 +111,6 @@ export const GET = defineApiRoute({ benutzer: true, aufnahme: { include: { - rechnungen: true, events: { include: { benutzer: { diff --git a/src/pages/api/geg-nachweis-wohnen/index.ts b/src/pages/api/geg-nachweis-wohnen/index.ts index 53c0471e..c8a8b968 100644 --- a/src/pages/api/geg-nachweis-wohnen/index.ts +++ b/src/pages/api/geg-nachweis-wohnen/index.ts @@ -1,7 +1,8 @@ import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; -import { GEGNachweisWohnenSchema, prisma } from "#lib/server/prisma"; +import { prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; +import { GEGNachweisWohnenSchema } from "src/generated/zod/gegnachweiswohnen.js"; import { z } from "zod"; export const PUT = defineApiRoute({ @@ -17,7 +18,8 @@ export const PUT = defineApiRoute({ benutzer_id: true, uid: true, aufnahme_id: true, - geg_einpreisung_id: true + geg_einpreisung_id: true, + rechnung_id: true }), uid_aufnahme: UUidWithPrefix }), @@ -109,7 +111,6 @@ export const GET = defineApiRoute({ benutzer: true, aufnahme: { include: { - rechnungen: true, events: { include: { benutzer: { diff --git a/src/pages/api/rechnung/anfordern.ts b/src/pages/api/rechnung/anfordern.ts index a73f7a29..21a50ce6 100644 --- a/src/pages/api/rechnung/anfordern.ts +++ b/src/pages/api/rechnung/anfordern.ts @@ -2,7 +2,7 @@ import { getAusweisartFromUUID, UUidWithPrefix } from "#components/Ausweis/types import { omit } from "#lib/helpers.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { sendGEGAnforderungsMail } from "#lib/server/mail/geg-anfordern.js"; -import { Enums, prisma } from "#lib/server/prisma.js"; +import { Enums, GEGNachweisGewerbe, GEGNachweisWohnen, prisma } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { GEGEinpreisungSchema } from "src/generated/zod/gegeinpreisung.js"; import { z } from "zod"; @@ -22,21 +22,35 @@ export const PUT = defineApiRoute({ const ausweisart = getAusweisartFromUUID(input.nachweis_uid); let einpreisung; + let nachweis: GEGNachweisWohnen | GEGNachweisGewerbe; if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) { - const nachweis = await prisma.gEGNachweisWohnen.findUnique({ + nachweis = await prisma.gEGNachweisWohnen.findUnique({ where: { uid: input.nachweis_uid } }) + } else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) { + nachweis = await prisma.gEGNachweisGewerbe.findUnique({ + where: { + uid: input.nachweis_uid + } + }) + } else { + throw new APIError({ + "code": "BAD_REQUEST", + "message": `Ausweisart wird nicht unterstützt: ${ausweisart}` + }) + } + - if (!nachweis || nachweis.benutzer_id !== user.id) { - throw new APIError({ - code: "BAD_REQUEST", - message: "Ausweis existiert nicht oder gehört einem anderen Benutzer." - }) - } - + if (!nachweis || nachweis.benutzer_id !== user.id) { + throw new APIError({ + code: "BAD_REQUEST", + message: "Ausweis existiert nicht oder gehört einem anderen Benutzer." + }) + } + if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) { einpreisung = await prisma.gEGEinpreisung.create({ data: { ...omit(input, ["nachweis_uid"]), @@ -53,16 +67,26 @@ export const PUT = defineApiRoute({ } } }) - await sendGEGAnforderungsMail(nachweis, user) - } else { - throw new APIError({ - "code": "BAD_REQUEST", - "message": `Ausweisart wird nicht unterstützt: ${ausweisart}` + } else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) { + einpreisung = await prisma.gEGEinpreisung.create({ + data: { + ...omit(input, ["nachweis_uid"]), + status: Enums.Einpreisungsstatus.open, + benutzer: { + connect: { + id: user.id + } + }, + geg_nachweis_gewerbe: { + connect: { + uid: input.nachweis_uid + } + } + } }) } - - + await sendGEGAnforderungsMail(nachweis, user) return { uid: einpreisung.uid diff --git a/src/pages/kundendaten.astro b/src/pages/kundendaten.astro index e11cda87..9a829cee 100644 --- a/src/pages/kundendaten.astro +++ b/src/pages/kundendaten.astro @@ -35,6 +35,6 @@ try { --- - +