GEG Nachweis Gewerbe

This commit is contained in:
Moritz Utcke
2025-03-12 16:21:27 -03:00
parent cf68652880
commit 0b93b2d230
17 changed files with 526 additions and 157 deletions

View File

@@ -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();

View File

@@ -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?

View File

@@ -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"),

View File

@@ -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;
}

View File

@@ -24,6 +24,8 @@
export let aufnahme: AufnahmeClient;
export let ausweisart: Enums.Ausweisart;
export let ausstellgrund: string[] = Object.values(Enums.Ausstellgrund);
</script>
<div id="ausweisart" class="bereich-box grid
@@ -47,8 +49,8 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
data-cy="ausstellgrund"
>
<option disabled selected value={null}>Bitte auswählen</option>
{#each Object.entries(Enums.Ausstellgrund) as [name, ausstellgrund]}
<option value={ausstellgrund}>{name}</option>
{#each ausstellgrund as name}
<option value={name}>{name}</option>
{/each}
</select>

View File

@@ -69,7 +69,7 @@
loginOverlayHidden = true
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | null = null;
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | 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 {

View File

@@ -284,4 +284,4 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
</HelpLabel>
</div>
</div>
</div>
</div>

View File

@@ -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.
})
});
});

View File

@@ -153,27 +153,24 @@
}
if (!await validateAccessTokenClient()) {
loginAction = bestellen
loginAction = anfordern
loginOverlayHidden = false;
return
}
loginOverlayHidden = true
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | null = null;
let result: Awaited<ReturnType<typeof nachweisSpeichern>> | 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<ReturnType<typeof ausweisSpeichern>> | null = null;
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | 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<ReturnType<typeof ausweisSpeichern>> | null = null;
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | 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 {

View File

@@ -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;
</script>
<div id="skala" class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll">
<Progressbar active={0} {ausweisart} {anliegen} steps={["Gebäudedaten","Kundendaten","Anfragebestätigung"]} />
<div
id="skala"
bind:this={skala}
class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll"
>
<Progressbar
active={0}
{ausweisart}
{anliegen}
steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]}
/>
</div>
<form
id="formInput-1"
name="ausweis"
data-test="ausweis"
>
<form id="formInput-1" name="ausweis" data-cy="nachweis" bind:this={form}>
<div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart -->
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart bind:objekt bind:aufnahme bind:ausweis={nachweis} {ausweisart} />
<Ausweisart
bind:objekt
bind:aufnahme
bind:ausweis={nachweis}
{ausweisart}
ausstellgrund={[
Enums.Ausstellgrund.Neubau,
Enums.Ausstellgrund.Modernisierung,
]}
/>
</Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
@@ -108,7 +145,12 @@
title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw."
></InputLabel>
<textarea class="rounded-e-none" rows="10" bind:value={nachweis.beschreibung}></textarea>
<textarea
class="rounded-e-none"
rows="10"
data-cy="beschreibung"
bind:value={nachweis.beschreibung}
></textarea>
<div class="help-label">
<HelpLabel>
@@ -181,14 +223,14 @@
</div>
<ButtonWeiterHilfe
bind:ausweis={nachweis}
bind:bilder
bind:unterlagen
bind:user
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.GEGNachweisGewerbe}
>
</ButtonWeiterHilfe>
bind:ausweis={nachweis}
bind:bilder
bind:unterlagen
bind:user
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.GEGNachweisGewerbe}
{form}
{skala}
></ButtonWeiterHilfe>
</form>

View File

@@ -1,13 +1,12 @@
<script lang="ts">
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
import {
ObjektClient,
AufnahmeClient,
BenutzerClient,
UploadedGebaeudeBild,
UnterlageClient,
GEGNachweisWohnenClient,
BildClient,
} from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte";
import { Enums } from "#lib/client/prisma.js";
@@ -18,57 +17,80 @@
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
import GEGAusweisart from "#components/GEGNachweis/GEGAusweisart.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 bilder: BildClient[] = [];
export let plaene: UnterlageClient[] = [];
export let unterlagen: UnterlageClient[] = [];
if (Object.keys(nachweis).length === 0) {
const localStorageAusweis = localStorage.getItem("geg-nachweis-wohnen.ausweis");
const localStorageAusweis = localStorage.getItem(
"geg-nachweis-wohnen.ausweis"
);
if (localStorageAusweis) {
nachweis = JSON.parse(localStorageAusweis)
nachweis = JSON.parse(localStorageAusweis);
}
}
if (Object.keys(aufnahme).length === 0) {
const localStorageAufnahme = localStorage.getItem("geg-nachweis-wohnen.aufnahme");
const localStorageAufnahme = localStorage.getItem(
"geg-nachweis-wohnen.aufnahme"
);
if (localStorageAufnahme) {
aufnahme = JSON.parse(localStorageAufnahme)
aufnahme = JSON.parse(localStorageAufnahme);
}
}
if (Object.keys(objekt).length === 0) {
const localStorageObjekt = localStorage.getItem("geg-nachweis-wohnen.objekt");
const localStorageObjekt = localStorage.getItem(
"geg-nachweis-wohnen.objekt"
);
if (localStorageObjekt) {
objekt = JSON.parse(localStorageObjekt)
objekt = JSON.parse(localStorageObjekt);
}
}
if (Object.keys(bilder).length === 0) {
const localStorageBilder = localStorage.getItem("geg-nachweis-wohnen.bilder");
const localStorageBilder = localStorage.getItem(
"geg-nachweis-wohnen.bilder"
);
if (localStorageBilder) {
bilder = JSON.parse(localStorageBilder)
bilder = JSON.parse(localStorageBilder);
}
}
if (Object.keys(unterlagen).length === 0) {
const localStorageUnterlagen = localStorage.getItem("geg-nachweis-wohnen.unterlagen");
const localStorageUnterlagen = localStorage.getItem(
"geg-nachweis-wohnen.unterlagen"
);
if (localStorageUnterlagen) {
unterlagen = JSON.parse(localStorageUnterlagen)
unterlagen = JSON.parse(localStorageUnterlagen);
}
}
$: {
localStorage.setItem("geg-nachweis-wohnen.ausweis", JSON.stringify(nachweis))
localStorage.setItem("geg-nachweis-wohnen.aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("geg-nachweis-wohnen.objekt", JSON.stringify(objekt))
localStorage.setItem("geg-nachweis-wohnen.bilder", JSON.stringify(bilder))
localStorage.setItem("geg-nachweis-wohnen.unterlagen", JSON.stringify(unterlagen))
localStorage.setItem(
"geg-nachweis-wohnen.ausweis",
JSON.stringify(nachweis)
);
localStorage.setItem(
"geg-nachweis-wohnen.aufnahme",
JSON.stringify(aufnahme)
);
localStorage.setItem(
"geg-nachweis-wohnen.objekt",
JSON.stringify(objekt)
);
localStorage.setItem(
"geg-nachweis-wohnen.bilder",
JSON.stringify(bilder)
);
localStorage.setItem(
"geg-nachweis-wohnen.unterlagen",
JSON.stringify(unterlagen)
);
}
const ausweisart = Enums.Ausweisart.GEGNachweisWohnen;
@@ -78,23 +100,30 @@
let skala: HTMLDivElement;
</script>
<div id="skala" bind:this={skala} class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll">
<Progressbar active={0} {ausweisart} {anliegen} steps={["Gebäudedaten","Kundendaten","Anfragebestätigung"]} />
</div>
<form
id="formInput-1"
name="ausweis"
data-test="ausweis"
bind:this={form}
<div
id="skala"
bind:this={skala}
class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll"
>
<Progressbar
active={0}
{ausweisart}
{anliegen}
steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]}
/>
</div>
<form id="formInput-1" name="ausweis" data-test="ausweis" bind:this={form}>
<div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart -->
<Bereich bereich="A" title="Prüfung der Ausweisart">
<GEGAusweisart bind:objekt bind:aufnahme bind:ausweis={nachweis} {ausweisart} />
<GEGAusweisart
bind:objekt
bind:aufnahme
bind:ausweis={nachweis}
{ausweisart}
/>
</Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
@@ -112,7 +141,11 @@
title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw."
></InputLabel>
<textarea class="rounded-e-none" rows="10" bind:value={nachweis.beschreibung}></textarea>
<textarea
class="rounded-e-none"
rows="10"
bind:value={nachweis.beschreibung}
></textarea>
<div class="help-label">
<HelpLabel>
@@ -185,16 +218,14 @@
</div>
<ButtonWeiterHilfe
bind:ausweis={nachweis}
bind:bilder
bind:unterlagen
bind:user
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.GEGNachweisWohnen}
{form}
{skala}
>
</ButtonWeiterHilfe>
bind:ausweis={nachweis}
bind:bilder
bind:unterlagen
bind:user
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.GEGNachweisWohnen}
{form}
{skala}
></ButtonWeiterHilfe>
</form>

View File

@@ -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);

View File

@@ -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({

View File

@@ -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: {

View File

@@ -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: {

View File

@@ -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

View File

@@ -35,6 +35,6 @@ try {
---
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {bilder} {ausweisart} {ausweistyp} aktiveBezahlmethode={Enums.Bezahlmethoden.paypal} client:only></KundendatenModule>
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {bilder} {ausweisart} {ausweistyp} unterlagen={[]} aktiveBezahlmethode={Enums.Bezahlmethoden.paypal} client:only></KundendatenModule>
</AusweisLayout>