From 4df30004def9f492a6316fa86481230946a126b9 Mon Sep 17 00:00:00 2001 From: Moritz Utcke Date: Tue, 5 Aug 2025 10:35:15 -0400 Subject: [PATCH] Ausweistyp --- prisma/schema/Provisionen.prisma | 1 + src/astro-typesafe-api-caller.ts | 14 +++++------ .../Abrechnung/AbrechnungTable.svelte | 8 ++++--- src/generated/zod/provisionen.ts | 3 ++- src/lib/provision.ts | 16 +++++++++++++ src/lib/server/ausweis.ts | 7 +++++- src/pages/dashboard/abrechnung/index.astro | 24 +++++++------------ .../dashboard/abrechnung/monatlich.pdf.astro | 13 +++++----- src/pages/dashboard/objekte/index.astro | 2 +- src/templates/pdf/abrechnung.handlebars | 4 ++-- 10 files changed, 55 insertions(+), 37 deletions(-) create mode 100644 src/lib/provision.ts diff --git a/prisma/schema/Provisionen.prisma b/prisma/schema/Provisionen.prisma index 5921048f..460800fc 100644 --- a/prisma/schema/Provisionen.prisma +++ b/prisma/schema/Provisionen.prisma @@ -1,6 +1,7 @@ model Provisionen { id Int @id @default(autoincrement()) ausweisart Ausweisart + ausweistyp AusweisTyp provision_prozent Float provision_betrag Float benutzer_id String? @db.VarChar(11) diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index cf57dd92..a440b7ab 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -12,27 +12,27 @@ export const createCaller = createCallerFactory({ "admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-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/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"), - "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), - "bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"), - "bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/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-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"), + "bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"), + "bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"), + "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "bilder/[id]": await import("../src/pages/api/bilder/[id].ts"), "geg-nachweis-gewerbe/[id]": await import("../src/pages/api/geg-nachweis-gewerbe/[id].ts"), "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"), "geg-nachweis-wohnen/[id]": await import("../src/pages/api/geg-nachweis-wohnen/[id].ts"), "geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"), + "objekt": await import("../src/pages/api/objekt/index.ts"), "rechnung/[id]": await import("../src/pages/api/rechnung/[id].ts"), "rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"), "rechnung": await import("../src/pages/api/rechnung/index.ts"), + "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"), - "ticket": await import("../src/pages/api/ticket/index.ts"), - "objekt": await import("../src/pages/api/objekt/index.ts"), "verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"), "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"), diff --git a/src/components/Abrechnung/AbrechnungTable.svelte b/src/components/Abrechnung/AbrechnungTable.svelte index 15af1403..56195264 100644 --- a/src/components/Abrechnung/AbrechnungTable.svelte +++ b/src/components/Abrechnung/AbrechnungTable.svelte @@ -2,6 +2,7 @@ import { Aufnahme, BedarfsausweisWohnen, Enums, Objekt, Provisionen, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/server/prisma.js"; import moment from "moment-timezone" import { DatePicker } from "@svelte-plugins/datepicker" + import { getProvision } from "#lib/provision.js"; export let bestellungen: (Rechnung & { ausweis: (VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe) & { aufnahme: Aufnahme & { objekt: Objekt }} })[]; @@ -77,7 +78,8 @@ {#if jahrMonat in bestellungenNachMonat && bestellungenNachMonat[jahrMonat].length > 0} {@const provisionMonat = bestellungenNachMonat[jahrMonat].reduce((acc, bestellung) => { - return acc + (provisionen.find((p) => p.ausweisart === bestellung.ausweis.ausweisart)?.provision_betrag || 0); + const { provision_prozent, provision_betrag } = getProvision(bestellung.ausweis.ausweisart, bestellung.ausweis.ausweistyp, provisionen); + return acc + provision_betrag; }, 0)}
@@ -104,11 +106,11 @@ {#each bestellungenNachMonat[jahrMonat] as bestellung} - {@const provisionBestellung = provisionen.find((p) => p.ausweisart === bestellung.ausweis.ausweisart)} + {@const provisionBestellung = getProvision(bestellung.ausweis.ausweisart, bestellung.ausweis.ausweistyp, provisionen)} {bestellung.ausweis.id} {moment(bestellung.created_at).format("DD.MM.YYYY HH:mm")} - {bestellung.ausweis.ausweisart} + {bestellung.ausweis.ausweisart} {bestellung.ausweis.ausweistyp} {provisionBestellung?.provision_prozent || 0} % {provisionBestellung?.provision_betrag.toFixed(2)} € diff --git a/src/generated/zod/provisionen.ts b/src/generated/zod/provisionen.ts index 1633010f..eeada8c3 100644 --- a/src/generated/zod/provisionen.ts +++ b/src/generated/zod/provisionen.ts @@ -1,9 +1,10 @@ import * as z from "zod" -import { Ausweisart } from "@prisma/client" +import { Ausweisart, AusweisTyp } from "@prisma/client" export const ProvisionenSchema = z.object({ id: z.number().int(), ausweisart: z.nativeEnum(Ausweisart), + ausweistyp: z.nativeEnum(AusweisTyp), provision_prozent: z.number(), provision_betrag: z.number(), benutzer_id: z.string().nullish(), diff --git a/src/lib/provision.ts b/src/lib/provision.ts new file mode 100644 index 00000000..45bcdcfc --- /dev/null +++ b/src/lib/provision.ts @@ -0,0 +1,16 @@ +import { Enums, Provisionen } from "./client/prisma.js"; + +export function getProvision(ausweisart: Enums.Ausweisart, ausweistyp: Enums.AusweisTyp, provisionen: Provisionen[]): { provision_prozent: number, provision_betrag: number } { + const provision = provisionen.find(p => p.ausweisart === ausweisart && p.ausweistyp === ausweistyp); + console.log(provisionen); + + return { + provision_prozent: provision?.provision_prozent || 0, + provision_betrag: provision?.provision_betrag || 0 + }; + +} + +export function getProductName(ausweisart: Enums.Ausweisart, ausweistyp: Enums.AusweisTyp): string { + return `${Enums.Ausweisart[ausweisart]} ${Enums.AusweisTyp[ausweistyp]}`; +} \ No newline at end of file diff --git a/src/lib/server/ausweis.ts b/src/lib/server/ausweis.ts index 13ee0821..442ff6f3 100644 --- a/src/lib/server/ausweis.ts +++ b/src/lib/server/ausweis.ts @@ -181,7 +181,7 @@ export function extrahiereAusweisAusFeldMitMehrerenAusweisen( verbrauchsausweis_wohnen, verbrauchsausweis_gewerbe, ...rest - } = row; + } = row; return { ...rest, ausweis: { @@ -193,6 +193,11 @@ export function extrahiereAusweisAusFeldMitMehrerenAusweisen( : verbrauchsausweis_wohnen ? Enums.Ausweisart.VerbrauchsausweisWohnen : Enums.Ausweisart.VerbrauchsausweisGewerbe, + ausweistyp: bedarfsausweis_wohnen + ? bedarfsausweis_wohnen.ausweistyp + : verbrauchsausweis_wohnen + ? verbrauchsausweis_wohnen.ausweistyp + : verbrauchsausweis_gewerbe?.ausweistyp || Enums.AusweisTyp.Standard, }, } as { ausweis: ( diff --git a/src/pages/dashboard/abrechnung/index.astro b/src/pages/dashboard/abrechnung/index.astro index b4c3375b..e310643e 100644 --- a/src/pages/dashboard/abrechnung/index.astro +++ b/src/pages/dashboard/abrechnung/index.astro @@ -1,6 +1,7 @@ --- import AbrechnungTable from "#components/Abrechnung/AbrechnungTable.svelte"; import BlankLayout from "#layouts/BlankLayout.astro"; +import { getProvision } from "#lib/provision"; import { extrahiereAusweisAusFeldMitMehrerenAusweisen } from "#lib/server/ausweis"; import { Enums, prisma } from "#lib/server/prisma"; import { getCurrentUser } from "#lib/server/user"; @@ -191,29 +192,20 @@ const provisionen = await prisma.provisionen.findMany({ } }) +bestellungen = bestellungen.map((bestellung) => + extrahiereAusweisAusFeldMitMehrerenAusweisen(bestellung) +); + let provision = 0; -const ausweisarten: string[] = []; for (const bestellung of bestellungen) { - if (bestellung.verbrauchsausweis_wohnen) { - ausweisarten.push(Enums.Ausweisart.VerbrauchsausweisWohnen); - provision += provisionen.find((p) => p.ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen)?.provision_betrag || 0; - } - if (bestellung.bedarfsausweis_wohnen) { - ausweisarten.push(Enums.Ausweisart.BedarfsausweisWohnen); - provision += provisionen.find((p) => p.ausweisart === Enums.Ausweisart.BedarfsausweisWohnen)?.provision_betrag || 0; - } - if (bestellung.verbrauchsausweis_gewerbe) { - ausweisarten.push(Enums.Ausweisart.VerbrauchsausweisGewerbe); - provision += provisionen.find((p) => p.ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe)?.provision_betrag || 0; - } + const { provision_betrag, provision_prozent } = getProvision(bestellung.ausweis.ausweisart, bestellung.ausweis.ausweistyp, provisionen); + provision += provision_betrag; } --- - extrahiereAusweisAusFeldMitMehrerenAusweisen(bestellung) - )} + bestellungen={bestellungen} {provisionen} startdatum={startdatum} enddatum={enddatum} diff --git a/src/pages/dashboard/abrechnung/monatlich.pdf.astro b/src/pages/dashboard/abrechnung/monatlich.pdf.astro index 93d70be1..c6e77b19 100644 --- a/src/pages/dashboard/abrechnung/monatlich.pdf.astro +++ b/src/pages/dashboard/abrechnung/monatlich.pdf.astro @@ -6,6 +6,7 @@ import moment from "moment"; import { getCurrentUser } from "#lib/server/user"; import { prisma } from "#lib/server/prisma"; import { extrahiereAusweisAusFeldMitMehrerenAusweisen } from "#lib/server/ausweis"; +import { getProvision } from "#lib/provision"; const datum = moment(Astro.url.searchParams.get("d")); const benutzer = await getCurrentUser(Astro); @@ -109,14 +110,14 @@ for (let i = 0; i < remainingBlocks.length; i += 20) { blocks.push(remainingBlocks.slice(i, i + 20)); } -Handlebars.registerHelper("get-provision-prozent", function (ausweisart) { - const provisionEintrag = provisionen.find((p) => p.ausweisart === ausweisart); - return provisionEintrag ? provisionEintrag.provision_prozent : 0; +Handlebars.registerHelper("get-provision-prozent", function (ausweisart, ausweistyp) { + const { provision_prozent } = getProvision(ausweisart, ausweistyp, provisionen); + return provision_prozent || 0; }); -Handlebars.registerHelper("get-provision-betrag", function (ausweisart) { - const provisionEintrag = provisionen.find((p) => p.ausweisart === ausweisart); - return provisionEintrag ? provisionEintrag.provision_betrag.toFixed(2) : "0.00"; +Handlebars.registerHelper("get-provision-betrag", function (ausweisart, ausweistyp) { + const { provision_betrag } = getProvision(ausweisart, ausweistyp, provisionen); + return provision_betrag ? provision_betrag.toFixed(2) : "0.00"; }); const template = Handlebars.compile(abrechnungTemplateHTML); diff --git a/src/pages/dashboard/objekte/index.astro b/src/pages/dashboard/objekte/index.astro index ea05c072..ca263de2 100644 --- a/src/pages/dashboard/objekte/index.astro +++ b/src/pages/dashboard/objekte/index.astro @@ -52,6 +52,6 @@ if (user.rolle !== Enums.BenutzerRolle.ADMIN) { } if (result.length > 0) { - return Astro.redirect(`/dashboard/objekte/${result[0].id}?p=${page}`) + return Astro.redirect(`/dashboard/objekte/${result[0].id}?p=${page}`); } --- \ No newline at end of file diff --git a/src/templates/pdf/abrechnung.handlebars b/src/templates/pdf/abrechnung.handlebars index 457a37c8..c383f301 100644 --- a/src/templates/pdf/abrechnung.handlebars +++ b/src/templates/pdf/abrechnung.handlebars @@ -63,10 +63,10 @@ {{#with ausweis}} - {{get-provision-prozent ausweisart}} % + {{get-provision-prozent ausweisart ausweistyp}} % - {{get-provision-betrag ausweisart}} € + {{get-provision-betrag ausweisart ausweistyp}} € {{/with}}