diff --git a/dbml/schema.dbml b/dbml/schema.dbml index 6b5ccf2b..bbc8bfac 100644 --- a/dbml/schema.dbml +++ b/dbml/schema.dbml @@ -453,6 +453,7 @@ Table VerbrauchsausweisGewerbe { alternative_lueftung Boolean alternative_kuehlung Boolean warmwasser_enthalten Boolean + warmwasser_anteil_bekannt Boolean [note: '@zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")'] anteil_warmwasser_1 Float anteil_warmwasser_2 Float ausgestellt Boolean [default: false] diff --git a/prisma/migrations/20250308100529_warmwasser_anteil_bekannt/migration.sql b/prisma/migrations/20250308100529_warmwasser_anteil_bekannt/migration.sql new file mode 100644 index 00000000..e94020be --- /dev/null +++ b/prisma/migrations/20250308100529_warmwasser_anteil_bekannt/migration.sql @@ -0,0 +1,48 @@ +-- 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 'gnw-' || 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" ADD COLUMN "warmwasser_anteil_bekannt" BOOLEAN, +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/VerbrauchsausweisGewerbe.prisma b/prisma/schema/VerbrauchsausweisGewerbe.prisma index 552c8916..d8b292e7 100644 --- a/prisma/schema/VerbrauchsausweisGewerbe.prisma +++ b/prisma/schema/VerbrauchsausweisGewerbe.prisma @@ -42,6 +42,8 @@ model VerbrauchsausweisGewerbe { alternative_kuehlung Boolean? warmwasser_enthalten Boolean? + /// @zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen") + warmwasser_anteil_bekannt Boolean? anteil_warmwasser_1 Float? anteil_warmwasser_2 Float? diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 89aa5f09..01c6a1a1 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"), - "ausweise": await import("../src/pages/api/ausweise/index.ts"), "aufnahme": await import("../src/pages/api/aufnahme/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"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), + "bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), + "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/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"), diff --git a/src/components/Ausweis/StromVerbrauch.svelte b/src/components/Ausweis/StromVerbrauch.svelte index 6607459d..6e449ad2 100644 --- a/src/components/Ausweis/StromVerbrauch.svelte +++ b/src/components/Ausweis/StromVerbrauch.svelte @@ -653,9 +653,8 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
diff --git a/src/components/Ausweis/Warmwasseranteil.svelte b/src/components/Ausweis/Warmwasseranteil.svelte index 8c03e59c..53dca3dd 100644 --- a/src/components/Ausweis/Warmwasseranteil.svelte +++ b/src/components/Ausweis/Warmwasseranteil.svelte @@ -1,8 +1,9 @@ -
+
{#if ausweis.storniert}
{/if} -
-
+
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen} -
+
Verbrauchsausweis Wohnen
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen} -
+
Bedarfsausweis Wohnen
{:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe} -
+
Verbrauchsausweis Gewerbe
{/if} {#if ausweis.ausgestellt} -
Ausgestellt
+ Ausgestellt + {:else if ausweis.bestellt} + Bestellt {/if}
{objekt.adresse}
@@ -141,7 +145,7 @@ >{progress}%
- {#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) then calculations} + {#await calculations then calculations}
Energieverbrauch @@ -183,22 +187,28 @@
ID {ausweis.uid.split("-")[0]}{ausweis.uid}
{/await} +
- Stornieren + {/if} - + Freigeben + >Bearbeiten + {/if} {/if} diff --git a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte index 5aa455a9..f8586ae7 100644 --- a/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte +++ b/src/modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte @@ -19,7 +19,7 @@ import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; import { BenutzerClient } from "#components/Ausweis/types.js"; import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte"; - import { Enums } from "#lib/client/prisma"; + import { Enums } from "#lib/client/prisma.js"; import moment from "moment"; import { AuditType, @@ -37,7 +37,11 @@ import { auditWohnFlaeche } from "#components/Verbrauchsausweis/audits/WohnFlaeche.js"; import { auditWohnflaecheGroesserGesamtflaeche } from "#components/Verbrauchsausweis/audits/WohnflaecheGroesserGesamtflaeche.js"; import { auditZeitraumAktuell } from "#components/Verbrauchsausweis/audits/ZeitraumAktuell.js"; - import { notifications, RawNotificationWrapper, RawNotification } from "@ibcornelsen/ui"; + import { + RawNotificationWrapper, + RawNotification, + notifications, + } from "#components/Notifications/index.js"; export let ausweis: VerbrauchsausweisGewerbeClient; export let user: BenutzerClient; @@ -116,10 +120,13 @@ localStorage.setItem("objekt", JSON.stringify(objekt)) localStorage.setItem("bilder", JSON.stringify(bilder)) } + + let form: HTMLFormElement; + let skala: HTMLDivElement; -
+
-
+
@@ -261,6 +270,9 @@ bind:objekt bind:aufnahme ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} + showWeiter={true} + {form} + {skala} > 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/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/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/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro index 7aa9b4be..1295b996 100644 --- a/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro +++ b/src/pages/energieausweis-erstellen/verbrauchsausweis-gewerbe/index.astro @@ -8,6 +8,7 @@ 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,6 +76,32 @@ 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 + } + }) } --- 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 ecb9b093..5781438e 100644 --- a/src/types/fake-data.ts +++ b/src/types/fake-data.ts @@ -660,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, @@ -703,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)",