Files
online-energieausweis/src/pages/dashboard/abrechnung/index.astro
Moritz Utcke 4df30004de Ausweistyp
2025-08-05 10:35:15 -04:00

233 lines
4.6 KiB
Plaintext

---
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";
import moment from "moment-timezone";
moment.tz.setDefault("Europe/Berlin");
const start = moment(Astro.url.searchParams.get("start"));
const end = moment(Astro.url.searchParams.get("end"));
let startdatum = start.isValid() ? start.toDate() : moment().startOf("month").toDate();
let enddatum = end.isValid() ? end.toDate() : moment().endOf("month").toDate();
const benutzer = await getCurrentUser(Astro);
if (!benutzer) {
return Astro.redirect("/404");
}
// $kommission = db()->one("SELECT abr_va, abr_ba, abr_vanw FROM users WHERE resellercode = :resellercode", ["resellercode" => $resellercode]);
// Select every entry from database where user was involved.
let bestellungen;
if (start.isValid() && end.isValid()) {
bestellungen = await prisma.rechnung.findMany({
where: {
partner_code: benutzer.partner_code,
OR: [
{
verbrauchsausweis_gewerbe: {
ausgestellt: true,
},
},
{
bedarfsausweis_wohnen: {
ausgestellt: true,
},
},
{
verbrauchsausweis_wohnen: {
ausgestellt: true,
},
},
],
AND: [
{
erstellt_am: {
gte: startdatum,
},
},
{
erstellt_am: {
lte: enddatum,
},
},
],
},
orderBy: {
erstellt_am: "desc",
},
include: {
bedarfsausweis_wohnen: {
include: {
aufnahme: {
include: {
objekt: true,
},
},
},
},
verbrauchsausweis_gewerbe: {
include: {
aufnahme: {
include: {
objekt: true,
},
},
},
},
verbrauchsausweis_wohnen: {
include: {
aufnahme: {
include: {
objekt: true,
},
},
},
},
},
});
} else {
bestellungen = await prisma.rechnung.findMany({
where: {
partner_code: benutzer.partner_code,
OR: [
{
verbrauchsausweis_gewerbe: {
ausgestellt: true,
},
},
{
bedarfsausweis_wohnen: {
ausgestellt: true,
},
},
{
verbrauchsausweis_wohnen: {
ausgestellt: true,
},
},
],
},
orderBy: {
erstellt_am: "desc",
},
include: {
bedarfsausweis_wohnen: {
include: {
aufnahme: {
include: {
objekt: true,
},
},
},
},
verbrauchsausweis_gewerbe: {
include: {
aufnahme: {
include: {
objekt: true,
},
},
},
},
verbrauchsausweis_wohnen: {
include: {
aufnahme: {
include: {
objekt: true,
},
},
},
},
},
});
}
// Wann wurde der partner_code zum ersten mal benutzt?
if (!startdatum) {
startdatum = (
await prisma.rechnung.findFirst({
select: {
erstellt_am: true,
},
where: {
partner_code: benutzer.partner_code,
OR: [
{
verbrauchsausweis_gewerbe: {
ausgestellt: true,
},
},
{
bedarfsausweis_wohnen: {
ausgestellt: true,
},
},
{
verbrauchsausweis_wohnen: {
ausgestellt: true,
},
},
],
erstellt_am: {
gte: moment().set("year", 2020).set("dayOfYear", 1).toDate(),
},
},
orderBy: {
erstellt_am: "asc",
},
})
)?.erstellt_am || moment().startOf("month").toDate();
}
const provisionen = await prisma.provisionen.findMany({
where: {
benutzer_id: benutzer.id
}
})
bestellungen = bestellungen.map((bestellung) =>
extrahiereAusweisAusFeldMitMehrerenAusweisen(bestellung)
);
let provision = 0;
for (const bestellung of bestellungen) {
const { provision_betrag, provision_prozent } = getProvision(bestellung.ausweis.ausweisart, bestellung.ausweis.ausweistyp, provisionen);
provision += provision_betrag;
}
---
<BlankLayout title="Monatliche Abrechnung">
<AbrechnungTable
bestellungen={bestellungen}
{provisionen}
startdatum={startdatum}
enddatum={enddatum}
email={benutzer.email}
client:load
/>
<div class="fixed bottom-0 left-0 right-0 bg-white p-4 shadow">
<div class="flex justify-between items-center">
<div>
<p>
Abrechnungsbetrag gesamt: <b>{provision.toFixed(2)} €</b>
</p>
</div>
<a
target="_blank"
rel="noreferrer noopener"
class="bg-secondary text-white px-4 py-2 rounded-lg hover:bg-secondary-focus"
href=`/dashboard/abrechnung/monatlich.pdf?d=${moment().subtract(1, "month").format("YYYY-MM")}`
>PDF für letzten Monat generieren.</a
>
</div>
</div>
</BlankLayout>