@@ -86,6 +88,7 @@
id="formInput-1"
name="ausweis"
data-test="ausweis"
+ bind:this={form}
>
@@ -189,6 +192,8 @@
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.GEGNachweisWohnen}
+ {form}
+ {skala}
>
diff --git a/src/pages/api/admin/stornieren.ts b/src/pages/api/admin/stornieren.ts
index 56c56419..3199e0d2 100644
--- a/src/pages/api/admin/stornieren.ts
+++ b/src/pages/api/admin/stornieren.ts
@@ -2,7 +2,7 @@ import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { adminMiddleware } from "#lib/middleware/authorization.js";
import { mollieClient } from "#lib/mollie.js";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
-import { Prisma, prisma } from "#lib/server/prisma";
+import { Prisma, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
diff --git a/src/pages/api/aufnahme/[uid]/index.ts b/src/pages/api/aufnahme/[uid]/index.ts
index b0ef0432..6c4234c7 100644
--- a/src/pages/api/aufnahme/[uid]/index.ts
+++ b/src/pages/api/aufnahme/[uid]/index.ts
@@ -1,8 +1,9 @@
import { AufnahmeClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
-import { AufnahmeSchema, 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 PATCH = defineApiRoute({
@@ -22,7 +23,7 @@ export const PATCH = defineApiRoute({
where: {
uid,
benutzer_id: user.id
- },
+ }
});
if (!aufnahme) {
diff --git a/src/pages/api/aufnahme/index.ts b/src/pages/api/aufnahme/index.ts
index cb2441bb..439fe1ff 100644
--- a/src/pages/api/aufnahme/index.ts
+++ b/src/pages/api/aufnahme/index.ts
@@ -1,6 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"
import { authorizationMiddleware } from "#lib/middleware/authorization.js"
-import { AufnahmeSchema, ObjektSchema, prisma } from "#lib/server/prisma"
+import { AufnahmeSchema, ObjektSchema, prisma } from "#lib/server/prisma.js"
import { APIError, defineApiRoute } from "astro-typesafe-api/server"
import { z } from "zod"
diff --git a/src/pages/api/objekt/index.ts b/src/pages/api/objekt/index.ts
index d8cd92ea..c8131b2a 100644
--- a/src/pages/api/objekt/index.ts
+++ b/src/pages/api/objekt/index.ts
@@ -9,7 +9,8 @@ export const PUT = defineApiRoute({
input: ObjektSchema.omit({
id: true,
uid: true,
- benutzer_id: true
+ benutzer_id: true,
+ erstellungsdatum: true
}),
output: z.object({
uid: UUidWithPrefix
diff --git a/src/pages/api/rechnung/index.ts b/src/pages/api/rechnung/index.ts
index df97c438..af768be1 100644
--- a/src/pages/api/rechnung/index.ts
+++ b/src/pages/api/rechnung/index.ts
@@ -1,5 +1,5 @@
import { z } from "zod";
-import { Enums, RechnungSchema, prisma } from "#lib/server/prisma";
+import { Enums, prisma } from "#lib/server/prisma.js";
import { mollieClient } from "#lib/mollie.js";
import { PaymentMethod } from "@mollie/api-client";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -10,6 +10,8 @@ import {
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
import { PRICES, SERVICES } from "#lib/constants.js";
+import { Rechnung } from "#lib/client/prisma.js";
+import { RechnungSchema } from "src/generated/zod/rechnung.js";
export const PUT = defineApiRoute({
meta: {
@@ -28,7 +30,6 @@ export const PUT = defineApiRoute({
.merge(
RechnungSchema.omit({
benutzer_id: true,
- aufnahme_id: true,
bezahlt_am: true,
erstellt_am: true,
id: true,
@@ -86,27 +87,57 @@ export const PUT = defineApiRoute({
});
}
- // TODO
// Wir erstellen eine neue Rechnung in unserer Datenbank.
- const rechnung = await prisma.rechnung.create({
- data: {
- benutzer_id: user.id,
- betrag,
- bezahlmethode: bezahlmethode,
- status: Enums.Rechnungsstatus.open,
- verbrauchsausweis_wohnen: {
- connect: {
- uid: ausweis_uid
- }
- },
- services,
- ausweistyp
- },
- select: {
- uid: true,
- betrag: true,
- },
- });
+ let rechnung: Rechnung | null = null;
+ if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
+ rechnung = await prisma.rechnung.create({
+ data: {
+ benutzer_id: user.id,
+ betrag,
+ bezahlmethode: bezahlmethode,
+ status: Enums.Rechnungsstatus.open,
+ verbrauchsausweis_wohnen: {
+ connect: {
+ uid: ausweis_uid
+ }
+ },
+ services,
+ ausweistyp
+ }
+ });
+ } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
+ rechnung = await prisma.rechnung.create({
+ data: {
+ benutzer_id: user.id,
+ betrag,
+ bezahlmethode: bezahlmethode,
+ status: Enums.Rechnungsstatus.open,
+ verbrauchsausweis_gewerbe: {
+ connect: {
+ uid: ausweis_uid
+ }
+ },
+ services,
+ ausweistyp
+ }
+ });
+ } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
+ rechnung = await prisma.rechnung.create({
+ data: {
+ benutzer_id: user.id,
+ betrag,
+ bezahlmethode: bezahlmethode,
+ status: Enums.Rechnungsstatus.open,
+ bedarfsausweis_wohnen: {
+ connect: {
+ uid: ausweis_uid
+ }
+ },
+ services,
+ ausweistyp
+ }
+ });
+ }
if (!rechnung) {
throw new APIError({
diff --git a/src/pages/api/unterlage.ts b/src/pages/api/unterlage.ts
index a4f0c7b3..ef51012f 100644
--- a/src/pages/api/unterlage.ts
+++ b/src/pages/api/unterlage.ts
@@ -1,10 +1,11 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
-import { prisma, UnterlageSchema } from "#lib/server/prisma";
+import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
import { fileURLToPath } from "url";
import { writeFileSync } from "fs";
import { PERSISTENT_DIR } from "#lib/server/constants.js";
+import { UnterlageSchema } from "src/generated/zod/unterlage.js";
export const PUT = defineApiRoute({
input: UnterlageSchema.omit({
diff --git a/src/pages/api/user/index.ts b/src/pages/api/user/index.ts
index 32fcfef9..b33241eb 100644
--- a/src/pages/api/user/index.ts
+++ b/src/pages/api/user/index.ts
@@ -1,6 +1,7 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { hashPassword } from "#lib/password.js";
+import { sendRegisterMail } from "#lib/server/mail/registrierung.js";
import { BenutzerSchema, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
@@ -50,20 +51,20 @@ export const PUT = defineApiRoute({
uid: UUidWithPrefix
}),
async fetch(input) {
- const user = await prisma.benutzer.findUnique({
+ const existingUser = await prisma.benutzer.findUnique({
where: {
email: input.email
}
})
- if (user) {
+ if (existingUser) {
throw new APIError({
code: "CONFLICT",
message: "Email Adresse ist bereits vergeben."
})
}
- const { uid } = await prisma.benutzer.create({
+ const user = await prisma.benutzer.create({
data: {
email: input.email,
passwort: hashPassword(input.passwort),
@@ -72,6 +73,8 @@ export const PUT = defineApiRoute({
}
})
- return { uid }
+ await sendRegisterMail(user)
+
+ return { uid: user.uid }
},
})
\ No newline at end of file
diff --git a/src/pages/api/verbrauchsausweis-gewerbe/[uid].ts b/src/pages/api/verbrauchsausweis-gewerbe/[uid].ts
index 74fcd268..892e40dd 100644
--- a/src/pages/api/verbrauchsausweis-gewerbe/[uid].ts
+++ b/src/pages/api/verbrauchsausweis-gewerbe/[uid].ts
@@ -1,8 +1,9 @@
import { OptionalNullable, UUidWithPrefix, VerbrauchsausweisGewerbeClient, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
-import { prisma, VerbrauchsausweisGewerbeSchema } from "#lib/server/prisma";
+import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
+import { VerbrauchsausweisGewerbeSchema } from "src/generated/zod/verbrauchsausweisgewerbe.js";
import { z } from "zod";
export const PATCH = defineApiRoute({
@@ -64,13 +65,6 @@ export const DELETE = defineApiRoute({
const ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
uid,
- },
- include: {
- aufnahme: {
- select: {
- storniert: true
- }
- }
}
});
@@ -100,7 +94,7 @@ export const DELETE = defineApiRoute({
// });
// }
- if (ausweis.aufnahme.storniert) {
+ if (ausweis.storniert) {
// Falls der Ausweis bereits storniert ist, werfen wir einen Fehler
throw new APIError({
code: "BAD_REQUEST",
@@ -108,9 +102,9 @@ export const DELETE = defineApiRoute({
});
}
- await prisma.aufnahme.update({
+ await prisma.verbrauchsausweisGewerbe.update({
where: {
- id: ausweis.aufnahme_id
+ uid
},
data: {
storniert: true
diff --git a/src/pages/api/verbrauchsausweis-gewerbe/index.ts b/src/pages/api/verbrauchsausweis-gewerbe/index.ts
index 9e738acb..8b4c1dd0 100644
--- a/src/pages/api/verbrauchsausweis-gewerbe/index.ts
+++ b/src/pages/api/verbrauchsausweis-gewerbe/index.ts
@@ -1,7 +1,8 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
-import { prisma, VerbrauchsausweisGewerbeSchema } from "#lib/server/prisma";
+import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
+import { VerbrauchsausweisGewerbeSchema } from "src/generated/zod/verbrauchsausweisgewerbe.js";
import { z } from "zod";
export const PUT = defineApiRoute({
@@ -17,7 +18,9 @@ export const PUT = defineApiRoute({
benutzer_id: true,
uid: true,
aufnahme_id: true
- }),
+ }).merge(z.object({
+ startdatum: z.coerce.date()
+ })),
uid_aufnahme: UUidWithPrefix
}),
output: z.object({
diff --git a/src/pages/api/verbrauchsausweis-wohnen/[uid].ts b/src/pages/api/verbrauchsausweis-wohnen/[uid].ts
index 338db999..d811acd8 100644
--- a/src/pages/api/verbrauchsausweis-wohnen/[uid].ts
+++ b/src/pages/api/verbrauchsausweis-wohnen/[uid].ts
@@ -1,8 +1,9 @@
import { OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
-import { prisma, VerbrauchsausweisWohnenSchema } from "#lib/server/prisma.js";
+import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
+import { VerbrauchsausweisWohnenSchema } from "src/generated/zod/verbrauchsausweiswohnen.js";
import { z } from "zod";
export const PATCH = defineApiRoute({
@@ -66,13 +67,6 @@ export const DELETE = defineApiRoute({
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid,
- },
- include: {
- aufnahme: {
- select: {
- storniert: true
- }
- }
}
});
@@ -102,7 +96,7 @@ export const DELETE = defineApiRoute({
// });
// }
- if (ausweis.aufnahme.storniert) {
+ if (ausweis.storniert) {
// Falls der Ausweis bereits storniert ist, werfen wir einen Fehler
throw new APIError({
code: "BAD_REQUEST",
@@ -110,9 +104,9 @@ export const DELETE = defineApiRoute({
});
}
- await prisma.aufnahme.update({
+ await prisma.verbrauchsausweisWohnen.update({
where: {
- id: ausweis.aufnahme_id
+ uid
},
data: {
storniert: true
diff --git a/src/pages/auth/verify.astro b/src/pages/auth/verify.astro
new file mode 100644
index 00000000..ce009659
--- /dev/null
+++ b/src/pages/auth/verify.astro
@@ -0,0 +1,32 @@
+---
+import Layout from "#layouts/Layout.astro";
+import { decodeToken } from "#lib/auth/token";
+import { TokenType } from "#lib/auth/types";
+import { prisma } from "#lib/server/prisma";
+
+const token = Astro.url.searchParams.get("t");
+
+if (!token) {
+ return Astro.redirect("/")
+}
+
+const payload = decodeToken(token)
+
+if (payload.typ !== TokenType.Verify || !payload.uid || !payload.exp || payload.exp < Date.now()) {
+ return Astro.redirect("/")
+}
+
+await prisma.benutzer.update({
+ where: {
+ uid: payload.uid
+ },
+ data: {
+ verified: true
+ }
+})
+---
+
+
+ Vielen Dank
+ Ihre Email Adresse wurde bestätigt, sie können diese Seite nun schließen.
+
\ No newline at end of file
diff --git a/src/pages/dashboard/index.astro b/src/pages/dashboard/index.astro
index b9a9c00f..7b90fb9b 100644
--- a/src/pages/dashboard/index.astro
+++ b/src/pages/dashboard/index.astro
@@ -31,6 +31,9 @@ const objekte = await prisma.objekt.findMany({
}
},
take: 10,
+ orderBy: {
+ erstellungsdatum: "desc"
+ },
include: {
aufnahmen: {
include: {
diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
index 7aa9b4be..16b1d2cf 100644
--- a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
+++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro
@@ -2,12 +2,12 @@
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types";
import { createCaller } from "src/astro-typesafe-api-caller";
-import { inferOutput } from "astro-typesafe-api/client";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
const uid = Astro.url.searchParams.get("uid");
+const uid_aufnahme = Astro.url.searchParams.get("aufnahme")
let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
@@ -75,9 +75,35 @@ if (uid) {
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
+} else if (uid_aufnahme) {
+ if (!valid) {
+ return Astro.redirect(
+ `/auth/login?redirect=${Astro.url.toString()}`
+ );
+ }
+
+ let { uid_objekt, ...result} = await caller.aufnahme._uid.GET.fetch(null, {
+ headers: {
+ authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
+ },
+ params: {
+ uid: uid_aufnahme
+ }
+ })
+
+ aufnahme = result;
+
+ objekt = await caller.objekt._uid.GET.fetch(null, {
+ headers: {
+ authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
+ },
+ params: {
+ uid: uid_objekt
+ }
+ })
}
---
-
+
\ No newline at end of file
diff --git a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
index 020dd3f4..1dd6a3f0 100644
--- a/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
+++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/index.astro
@@ -8,6 +8,7 @@ import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import { Enums } from "#lib/server/prisma";
const uid = Astro.url.searchParams.get("uid");
+const uid_aufnahme = Astro.url.searchParams.get("aufnahme")
const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard;
@@ -76,6 +77,32 @@ if (uid) {
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
+} else if (uid_aufnahme) {
+ if (!valid) {
+ return Astro.redirect(
+ `/auth/login?redirect=${Astro.url.toString()}`
+ );
+ }
+
+ let { uid_objekt, ...result} = await caller.aufnahme._uid.GET.fetch(null, {
+ headers: {
+ authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
+ },
+ params: {
+ uid: uid_aufnahme
+ }
+ })
+
+ aufnahme = result;
+
+ objekt = await caller.objekt._uid.GET.fetch(null, {
+ headers: {
+ authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
+ },
+ params: {
+ uid: uid_objekt
+ }
+ })
}
---
diff --git a/src/types/fake-data.ts b/src/types/fake-data.ts
index 94ad8e9b..5781438e 100644
--- a/src/types/fake-data.ts
+++ b/src/types/fake-data.ts
@@ -338,6 +338,7 @@ export function fakeBenutzerComplete() {
rolle: BenutzerRolle.USER,
firma: undefined,
lex_office_id: undefined,
+ verified: false,
};
}
export function fakeBild() {
@@ -659,6 +660,7 @@ export function fakeVerbrauchsausweisGewerbe() {
alternative_lueftung: undefined,
alternative_kuehlung: undefined,
warmwasser_enthalten: undefined,
+ warmwasser_anteil_bekannt: undefined,
anteil_warmwasser_1: undefined,
anteil_warmwasser_2: undefined,
prueftext: undefined,
@@ -702,6 +704,7 @@ export function fakeVerbrauchsausweisGewerbeComplete() {
alternative_lueftung: undefined,
alternative_kuehlung: undefined,
warmwasser_enthalten: undefined,
+ warmwasser_anteil_bekannt: undefined,
anteil_warmwasser_1: undefined,
anteil_warmwasser_2: undefined,
ausgestellt: false,
diff --git a/tailwind.config.cjs b/tailwind.config.cjs
index c025426e..7b430dfb 100644
--- a/tailwind.config.cjs
+++ b/tailwind.config.cjs
@@ -32,6 +32,10 @@ module.exports = {
'base-content': '#1e2734',
'box-heading': '#3A4AB5',
+ 'accent': '#7b37cd',
+ 'accent-focus': '#5f25a7',
+ 'accent-content': '#ffffff',
+
"formular-box": "rgba(252,234,187,0.2)",
"formular-rahmen": "rgba(255,204,6,1)",