Ausweistyp
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
model Provisionen {
|
model Provisionen {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
ausweisart Ausweisart
|
ausweisart Ausweisart
|
||||||
|
ausweistyp AusweisTyp
|
||||||
provision_prozent Float
|
provision_prozent Float
|
||||||
provision_betrag Float
|
provision_betrag Float
|
||||||
benutzer_id String? @db.VarChar(11)
|
benutzer_id String? @db.VarChar(11)
|
||||||
|
|||||||
@@ -12,27 +12,27 @@ export const createCaller = createCallerFactory({
|
|||||||
"admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"),
|
"admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"),
|
||||||
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
|
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
|
||||||
"admin/stornieren": await import("../src/pages/api/admin/stornieren.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"),
|
"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/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||||
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.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"),
|
"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"),
|
"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/[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-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/[id]": await import("../src/pages/api/geg-nachweis-wohnen/[id].ts"),
|
||||||
"geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.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/[id]": await import("../src/pages/api/rechnung/[id].ts"),
|
||||||
"rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"),
|
"rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"),
|
||||||
"rechnung": await import("../src/pages/api/rechnung/index.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": await import("../src/pages/api/user/index.ts"),
|
||||||
"user/self": await import("../src/pages/api/user/self.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/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"),
|
||||||
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
||||||
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
|
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import { Aufnahme, BedarfsausweisWohnen, Enums, Objekt, Provisionen, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/server/prisma.js";
|
import { Aufnahme, BedarfsausweisWohnen, Enums, Objekt, Provisionen, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/server/prisma.js";
|
||||||
import moment from "moment-timezone"
|
import moment from "moment-timezone"
|
||||||
import { DatePicker } from "@svelte-plugins/datepicker"
|
import { DatePicker } from "@svelte-plugins/datepicker"
|
||||||
|
import { getProvision } from "#lib/provision.js";
|
||||||
export let bestellungen: (Rechnung & {
|
export let bestellungen: (Rechnung & {
|
||||||
ausweis: (VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe) & { aufnahme: Aufnahme & { objekt: Objekt }}
|
ausweis: (VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe) & { aufnahme: Aufnahme & { objekt: Objekt }}
|
||||||
})[];
|
})[];
|
||||||
@@ -77,7 +78,8 @@
|
|||||||
{#if jahrMonat in bestellungenNachMonat && bestellungenNachMonat[jahrMonat].length > 0}
|
{#if jahrMonat in bestellungenNachMonat && bestellungenNachMonat[jahrMonat].length > 0}
|
||||||
<!-- Echo dropdown foreach month. -->
|
<!-- Echo dropdown foreach month. -->
|
||||||
{@const provisionMonat = bestellungenNachMonat[jahrMonat].reduce((acc, bestellung) => {
|
{@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)}
|
}, 0)}
|
||||||
|
|
||||||
<details class="group" open>
|
<details class="group" open>
|
||||||
@@ -104,11 +106,11 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody class="text-sm">
|
<tbody class="text-sm">
|
||||||
{#each bestellungenNachMonat[jahrMonat] as bestellung}
|
{#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)}
|
||||||
<tr class="border-b border-gray-300 hover:bg-gray-100">
|
<tr class="border-b border-gray-300 hover:bg-gray-100">
|
||||||
<td class="text-center py-2 px-4 w-24" style="font-family: monospace;">{bestellung.ausweis.id}</td>
|
<td class="text-center py-2 px-4 w-24" style="font-family: monospace;">{bestellung.ausweis.id}</td>
|
||||||
<td class="text-center py-2 font-bold w-32">{moment(bestellung.created_at).format("DD.MM.YYYY HH:mm")}</td>
|
<td class="text-center py-2 font-bold w-32">{moment(bestellung.created_at).format("DD.MM.YYYY HH:mm")}</td>
|
||||||
<td class="text-center py-2 w-32">{bestellung.ausweis.ausweisart}</td>
|
<td class="text-center py-2 w-32">{bestellung.ausweis.ausweisart} {bestellung.ausweis.ausweistyp}</td>
|
||||||
<td class="text-center py-2 w-32">{provisionBestellung?.provision_prozent || 0} %</td>
|
<td class="text-center py-2 w-32">{provisionBestellung?.provision_prozent || 0} %</td>
|
||||||
<td class="text-right py-2 w-24" style="font-family: monospace;">{provisionBestellung?.provision_betrag.toFixed(2)} €</td>
|
<td class="text-right py-2 w-24" style="font-family: monospace;">{provisionBestellung?.provision_betrag.toFixed(2)} €</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import * as z from "zod"
|
import * as z from "zod"
|
||||||
import { Ausweisart } from "@prisma/client"
|
import { Ausweisart, AusweisTyp } from "@prisma/client"
|
||||||
|
|
||||||
export const ProvisionenSchema = z.object({
|
export const ProvisionenSchema = z.object({
|
||||||
id: z.number().int(),
|
id: z.number().int(),
|
||||||
ausweisart: z.nativeEnum(Ausweisart),
|
ausweisart: z.nativeEnum(Ausweisart),
|
||||||
|
ausweistyp: z.nativeEnum(AusweisTyp),
|
||||||
provision_prozent: z.number(),
|
provision_prozent: z.number(),
|
||||||
provision_betrag: z.number(),
|
provision_betrag: z.number(),
|
||||||
benutzer_id: z.string().nullish(),
|
benutzer_id: z.string().nullish(),
|
||||||
|
|||||||
16
src/lib/provision.ts
Normal file
16
src/lib/provision.ts
Normal file
@@ -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]}`;
|
||||||
|
}
|
||||||
@@ -193,6 +193,11 @@ export function extrahiereAusweisAusFeldMitMehrerenAusweisen<T>(
|
|||||||
: verbrauchsausweis_wohnen
|
: verbrauchsausweis_wohnen
|
||||||
? Enums.Ausweisart.VerbrauchsausweisWohnen
|
? Enums.Ausweisart.VerbrauchsausweisWohnen
|
||||||
: Enums.Ausweisart.VerbrauchsausweisGewerbe,
|
: Enums.Ausweisart.VerbrauchsausweisGewerbe,
|
||||||
|
ausweistyp: bedarfsausweis_wohnen
|
||||||
|
? bedarfsausweis_wohnen.ausweistyp
|
||||||
|
: verbrauchsausweis_wohnen
|
||||||
|
? verbrauchsausweis_wohnen.ausweistyp
|
||||||
|
: verbrauchsausweis_gewerbe?.ausweistyp || Enums.AusweisTyp.Standard,
|
||||||
},
|
},
|
||||||
} as {
|
} as {
|
||||||
ausweis: (
|
ausweis: (
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
import AbrechnungTable from "#components/Abrechnung/AbrechnungTable.svelte";
|
import AbrechnungTable from "#components/Abrechnung/AbrechnungTable.svelte";
|
||||||
import BlankLayout from "#layouts/BlankLayout.astro";
|
import BlankLayout from "#layouts/BlankLayout.astro";
|
||||||
|
import { getProvision } from "#lib/provision";
|
||||||
import { extrahiereAusweisAusFeldMitMehrerenAusweisen } from "#lib/server/ausweis";
|
import { extrahiereAusweisAusFeldMitMehrerenAusweisen } from "#lib/server/ausweis";
|
||||||
import { Enums, prisma } from "#lib/server/prisma";
|
import { Enums, prisma } from "#lib/server/prisma";
|
||||||
import { getCurrentUser } from "#lib/server/user";
|
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;
|
let provision = 0;
|
||||||
const ausweisarten: string[] = [];
|
|
||||||
for (const bestellung of bestellungen) {
|
for (const bestellung of bestellungen) {
|
||||||
if (bestellung.verbrauchsausweis_wohnen) {
|
const { provision_betrag, provision_prozent } = getProvision(bestellung.ausweis.ausweisart, bestellung.ausweis.ausweistyp, provisionen);
|
||||||
ausweisarten.push(Enums.Ausweisart.VerbrauchsausweisWohnen);
|
provision += provision_betrag;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
---
|
---
|
||||||
|
|
||||||
<BlankLayout title="Monatliche Abrechnung">
|
<BlankLayout title="Monatliche Abrechnung">
|
||||||
<AbrechnungTable
|
<AbrechnungTable
|
||||||
bestellungen={bestellungen.map((bestellung) =>
|
bestellungen={bestellungen}
|
||||||
extrahiereAusweisAusFeldMitMehrerenAusweisen(bestellung)
|
|
||||||
)}
|
|
||||||
{provisionen}
|
{provisionen}
|
||||||
startdatum={startdatum}
|
startdatum={startdatum}
|
||||||
enddatum={enddatum}
|
enddatum={enddatum}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import moment from "moment";
|
|||||||
import { getCurrentUser } from "#lib/server/user";
|
import { getCurrentUser } from "#lib/server/user";
|
||||||
import { prisma } from "#lib/server/prisma";
|
import { prisma } from "#lib/server/prisma";
|
||||||
import { extrahiereAusweisAusFeldMitMehrerenAusweisen } from "#lib/server/ausweis";
|
import { extrahiereAusweisAusFeldMitMehrerenAusweisen } from "#lib/server/ausweis";
|
||||||
|
import { getProvision } from "#lib/provision";
|
||||||
|
|
||||||
const datum = moment(Astro.url.searchParams.get("d"));
|
const datum = moment(Astro.url.searchParams.get("d"));
|
||||||
const benutzer = await getCurrentUser(Astro);
|
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));
|
blocks.push(remainingBlocks.slice(i, i + 20));
|
||||||
}
|
}
|
||||||
|
|
||||||
Handlebars.registerHelper("get-provision-prozent", function (ausweisart) {
|
Handlebars.registerHelper("get-provision-prozent", function (ausweisart, ausweistyp) {
|
||||||
const provisionEintrag = provisionen.find((p) => p.ausweisart === ausweisart);
|
const { provision_prozent } = getProvision(ausweisart, ausweistyp, provisionen);
|
||||||
return provisionEintrag ? provisionEintrag.provision_prozent : 0;
|
return provision_prozent || 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
Handlebars.registerHelper("get-provision-betrag", function (ausweisart) {
|
Handlebars.registerHelper("get-provision-betrag", function (ausweisart, ausweistyp) {
|
||||||
const provisionEintrag = provisionen.find((p) => p.ausweisart === ausweisart);
|
const { provision_betrag } = getProvision(ausweisart, ausweistyp, provisionen);
|
||||||
return provisionEintrag ? provisionEintrag.provision_betrag.toFixed(2) : "0.00";
|
return provision_betrag ? provision_betrag.toFixed(2) : "0.00";
|
||||||
});
|
});
|
||||||
|
|
||||||
const template = Handlebars.compile(abrechnungTemplateHTML);
|
const template = Handlebars.compile(abrechnungTemplateHTML);
|
||||||
|
|||||||
@@ -52,6 +52,6 @@ if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result.length > 0) {
|
if (result.length > 0) {
|
||||||
return Astro.redirect(`/dashboard/objekte/${result[0].id}?p=${page}`)
|
return Astro.redirect(`/dashboard/objekte/${result[0].id}?p=${page}`);
|
||||||
}
|
}
|
||||||
---
|
---
|
||||||
@@ -63,10 +63,10 @@
|
|||||||
</td>
|
</td>
|
||||||
{{#with ausweis}}
|
{{#with ausweis}}
|
||||||
<td class=" border-black border p-1 text-sm text-center">
|
<td class=" border-black border p-1 text-sm text-center">
|
||||||
{{get-provision-prozent ausweisart}} %
|
{{get-provision-prozent ausweisart ausweistyp}} %
|
||||||
</td>
|
</td>
|
||||||
<td class=" border-black border p-1 text-sm text-center">
|
<td class=" border-black border p-1 text-sm text-center">
|
||||||
{{get-provision-betrag ausweisart}} €
|
{{get-provision-betrag ausweisart ausweistyp}} €
|
||||||
</td>
|
</td>
|
||||||
{{/with}}
|
{{/with}}
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user