Abrechnungsübersicht
This commit is contained in:
@@ -12,8 +12,8 @@ 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"),
|
||||
"ausweise": await import("../src/pages/api/ausweise/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"),
|
||||
@@ -33,10 +33,10 @@ export const createCaller = createCallerFactory({
|
||||
"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"),
|
||||
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
|
||||
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/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"),
|
||||
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
|
||||
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
||||
"aufnahme/[id]/bilder": await import("../src/pages/api/aufnahme/[id]/bilder.ts"),
|
||||
"aufnahme/[id]": await import("../src/pages/api/aufnahme/[id]/index.ts"),
|
||||
|
||||
121
src/components/Abrechnung/AbrechnungTable.svelte
Normal file
121
src/components/Abrechnung/AbrechnungTable.svelte
Normal file
@@ -0,0 +1,121 @@
|
||||
<script lang="ts">
|
||||
import { Aufnahme, BedarfsausweisWohnen, Enums, Objekt, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/server/prisma.js";
|
||||
import moment from "moment";
|
||||
import { DatePicker } from "@svelte-plugins/datepicker"
|
||||
export let bestellungen: (Rechnung & {
|
||||
ausweis: (VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe) & { aufnahme: Aufnahme & { objekt: Objekt }}
|
||||
})[];
|
||||
export let provisionen: Record<Enums.Ausweisart, number>;
|
||||
export let partnerCodeErstesMal: Date;
|
||||
export let email: string;
|
||||
|
||||
const bestellungenNachMonat: Record<string, (typeof bestellungen)> = {};
|
||||
for (const bestellung of bestellungen) {
|
||||
const monat = moment(bestellung.created_at).format("Y-MM");
|
||||
if (monat in bestellungenNachMonat) {
|
||||
bestellungenNachMonat[monat].push(bestellung)
|
||||
} else {
|
||||
bestellungenNachMonat[monat] = [bestellung]
|
||||
}
|
||||
}
|
||||
|
||||
// Wir brauchen alle Monate zwischen dem ersten Mal, dass der partner_code benutzt wurde bis zum heutigen Zeitpunkt.
|
||||
const months: Record<string, string> = {
|
||||
"01": "Januar", "02": "Februar", "03": "März", "04": "April",
|
||||
"05": "Mai", "06": "Juni", "07": "Juli", "08": "August",
|
||||
"09": "September", "10": "Oktober", "11": "November", "12": "Dezember"
|
||||
};
|
||||
|
||||
function getMonthlyPeriods(minTime?: Date): moment.Moment[] {
|
||||
const min = minTime ? moment(minTime) : moment();
|
||||
const start = min.clone().startOf('month');
|
||||
|
||||
const end = moment().add(1, 'month').startOf('month');
|
||||
|
||||
const monthsArray: moment.Moment[] = [];
|
||||
const current = start.clone();
|
||||
|
||||
while (current.isBefore(end)) {
|
||||
monthsArray.push(current.clone());
|
||||
current.add(1, 'month');
|
||||
}
|
||||
|
||||
return monthsArray.reverse(); // Most recent month first
|
||||
}
|
||||
|
||||
const periods = getMonthlyPeriods(partnerCodeErstesMal)
|
||||
|
||||
|
||||
let isOpen = false;
|
||||
export let startDate = moment(partnerCodeErstesMal).startOf('month').toDate();
|
||||
export let endDate = moment().endOf('month').toDate();
|
||||
$: formattedStartDate = moment(startDate).format("DD.MM.YYYY");
|
||||
$: formattedEndDate = moment(endDate).format("DD.MM.YYYY");
|
||||
function toggleDatePicker() {
|
||||
isOpen = !isOpen;
|
||||
}
|
||||
|
||||
const onChange = ({ startDate, endDate }: { startDate: number, endDate: number }) => {
|
||||
window.location.href = `/dashboard/abrechnung?start=${moment(startDate).format("YYYY-MM-DD")}&end=${moment(endDate).format("YYYY-MM-DD")}`;
|
||||
};
|
||||
</script>
|
||||
|
||||
<div class="fixed top-0 left-0 right-0 bg-white p-4 shadow z-10">
|
||||
<div class="flex justify-between items-center">
|
||||
<DatePicker bind:isOpen bind:startDate bind:endDate isRange={true} onDateChange={onChange} isMultipane={true}>
|
||||
<input type="text" class="w-min" readonly value={`${formattedStartDate} - ${formattedEndDate}`} on:click={toggleDatePicker} />
|
||||
</DatePicker>
|
||||
<p>Abrechnungsübersicht für <strong>{email}</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<main class="my-24 flex justify-center max-w-6xl mx-auto px-4">
|
||||
{#if !bestellungen || bestellungen.length === 0}
|
||||
<p class="text-center text-gray-500">Keine Bestellungen gefunden.</p>
|
||||
{/if}
|
||||
{#each periods as dt}
|
||||
{@const jahrMonat = dt.format("Y-MM")}
|
||||
{#if jahrMonat in bestellungenNachMonat && bestellungenNachMonat[jahrMonat].length > 0}
|
||||
<!-- Echo dropdown foreach month. -->
|
||||
{@const provisionMonat = bestellungenNachMonat[jahrMonat].reduce((acc, bestellung) => {
|
||||
return acc + provisionen[bestellung.ausweis.ausweisart] || 0;
|
||||
}, 0) * 1.19}
|
||||
|
||||
<!-- <div onclick="$(this).nextUntil('.dropdown_month').filter('table').toggle(); $('#betrag_gesamt').html('Abrechnungsbetrag $month_name: <b>$provision_month €</b>')" class='dropdown_month'>
|
||||
<p>$month_name $year_name - Klicke, um Tabelle anzuzeigen</p>
|
||||
<a target='_blank' rel='noreferrer noopener' href='/user/abrechnung/pdf.php?month={dt.format("m")}&year={dt.format("Y")}'>PDF Ansehen</a>
|
||||
</div> -->
|
||||
<table class="w-full mb-4 border-collapse border border-gray-300">
|
||||
<thead>
|
||||
<tr class="bg-primary text-white">
|
||||
<td class="text-center font-bold">ID</td>
|
||||
<td class="text-center font-bold">DATUM</td>
|
||||
<td class="text-center font-bold">GEBÄUDEADRESSE </td>
|
||||
<td class="text-center font-bold">PLZ </td>
|
||||
<td class="text-center font-bold">ORT </td>
|
||||
<td class="text-center font-bold">AUSWEIS</td>
|
||||
<td class="text-center font-bold w-48">BETRAG NETTO</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-sm">
|
||||
<tr class="bg-secondary text-white">
|
||||
<td class="text-center font-bold" colspan="6">{months[dt.format("MM")]} {dt.format("YYYY")}</td>
|
||||
<td class="text-right font-bold w-48" style="font-family: monospace;">{provisionMonat.toFixed(2)} €</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
{#each bestellungenNachMonat[jahrMonat] as bestellung}
|
||||
{@const provisionBestellung = provisionen[bestellung.ausweis.ausweisart] || 0}
|
||||
<tr>
|
||||
<td class="text-center px-4 w-24" style="font-family: monospace;">{bestellung.id}</td>
|
||||
<td class="text-center font-bold w-32">{moment(bestellung.created_at).format("DD.MM.YYYY")}</td>
|
||||
<td class="text-left w-64">{bestellung.ausweis.aufnahme.objekt.adresse}</td>
|
||||
<td class="text-center w-16">{bestellung.ausweis.aufnahme.objekt.plz}</td>
|
||||
<td class="text-left w-64">{bestellung.ausweis.aufnahme.objekt.ort}</td>
|
||||
<td class="text-center w-32">{bestellung.ausweis.ausweisart}</td>
|
||||
<td class="text-right w-48" style="font-family: monospace;">{provisionBestellung.toFixed(2)} €</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</table>
|
||||
{/if}
|
||||
{/each}
|
||||
</main>
|
||||
@@ -1,109 +0,0 @@
|
||||
<script lang="ts">
|
||||
import { BedarfsausweisWohnen, Enums, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/server/prisma.js";
|
||||
import moment from "moment";
|
||||
import { format } from "sharp";
|
||||
|
||||
export let bestellungen: (Rechnung & {
|
||||
verbrauchsausweis_wohnen: VerbrauchsausweisWohnen | null,
|
||||
verbrauchsausweis_gewerbe: VerbrauchsausweisGewerbe | null,
|
||||
bedarfsausweis_wohnen: BedarfsausweisWohnen | null,
|
||||
})[];
|
||||
export let provisionen: Record<Enums.Ausweisart, number>;
|
||||
export let partnerCodeErstesMal: Date;
|
||||
|
||||
const bestellungenNachMonat: Record<string, (typeof bestellungen)> = {};
|
||||
for (const bestellung of bestellungen) {
|
||||
const monat = moment(bestellung.created_at).format("Y-m");
|
||||
if (monat in bestellungenNachMonat) {
|
||||
bestellungenNachMonat[monat].push(bestellung)
|
||||
} else {
|
||||
bestellungenNachMonat[monat] = [bestellung]
|
||||
}
|
||||
}
|
||||
|
||||
// Wir brauchen alle Monate zwischen dem ersten Mal, dass der partner_code benutzt wurde bis zum heutigen Zeitpunkt.
|
||||
const months: Record<string, string> = {
|
||||
"01": "Januar", "02": "Februar", "03": "März", "04": "April",
|
||||
"05": "Mai", "06": "Juni", "07": "Juli", "08": "August",
|
||||
"09": "September", "10": "Oktober", "11": "November", "12": "Dezember"
|
||||
};
|
||||
|
||||
function getMonthlyPeriods(minTime?: Date): moment.Moment[] {
|
||||
const min = minTime ? moment(minTime) : moment();
|
||||
const start = min.clone().startOf('month');
|
||||
|
||||
const end = moment().add(1, 'month').startOf('month');
|
||||
|
||||
const monthsArray: moment.Moment[] = [];
|
||||
const current = start.clone();
|
||||
|
||||
while (current.isBefore(end)) {
|
||||
monthsArray.push(current.clone());
|
||||
current.add(1, 'month');
|
||||
}
|
||||
|
||||
return monthsArray.reverse(); // Most recent month first
|
||||
}
|
||||
|
||||
const periods = getMonthlyPeriods(partnerCodeErstesMal)
|
||||
</script>
|
||||
|
||||
{#each periods as dt}
|
||||
{@const jahrMonat = dt.format("Y-m")}
|
||||
{#if jahrMonat in bestellungenNachMonat && bestellungenNachMonat[jahrMonat].length > 0}
|
||||
<!-- Echo dropdown foreach month. -->
|
||||
{@const provisionMonat = bestellungenNachMonat[jahrMonat].reduce((acc, bestellung) => {
|
||||
if (bestellung.verbrauchsausweis_wohnen) {
|
||||
return acc + provisionen[Enums.Ausweisart.VerbrauchsausweisWohnen];
|
||||
}
|
||||
if (bestellung.bedarfsausweis_wohnen) {
|
||||
return acc + provisionen[Enums.Ausweisart.BedarfsausweisWohnen];
|
||||
}
|
||||
if (bestellung.verbrauchsausweis_gewerbe) {
|
||||
return acc + provisionen[Enums.Ausweisart.VerbrauchsausweisGewerbe];
|
||||
}
|
||||
|
||||
return acc;
|
||||
}) * 1.19}
|
||||
|
||||
<div onclick="$(this).nextUntil('.dropdown_month').filter('table').toggle(); $('#betrag_gesamt').html('Abrechnungsbetrag $month_name: <b>$provision_month €</b>')" class='dropdown_month'>
|
||||
<p>$month_name $year_name - Klicke, um Tabelle anzuzeigen</p>
|
||||
<a target='_blank' rel='noreferrer noopener' href='/user/abrechnung/pdf.php?month={dt.format("m")}&year={dt.format("Y")}'>PDF Ansehen</a>
|
||||
</div>
|
||||
<table id='QTT' style='margin-top: 0 !important; display:none;'>
|
||||
<thead>
|
||||
<tr>
|
||||
<td style='text-align:center;'>ID</td>
|
||||
<td style='text-align:center;'>DATUM</td>
|
||||
<td style='width:11em;text-align:center;'>GEBÄUDEADRESSE </td>
|
||||
<td style='width:11em;text-align:center;'>PLZ </td>
|
||||
<td style='width:11em;text-align:center;'>ORT </td>
|
||||
<td style='text-align:center;'>AUSWEIS</td>
|
||||
<td style='width:5em;text-align:center;'>BETRAG NETTO</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{#each bestellungenNachMonat[jahrMonat] as bestellung}
|
||||
{@const provisionBestellung = bestellung.verbrauchsausweis_wohnen ? provisionen[Enums.Ausweisart.VerbrauchsausweisWohnen] : bestellung.verbrauchsausweis_gewerbe ? provisionen[Enums.Ausweisart.VerbrauchsausweisGewerbe] : provisionen[Enums.Ausweisart.BedarfsausweisWohnen]}
|
||||
<tr>
|
||||
<td style='width:1em;text-align:center;'>{bestellung.id}</td>
|
||||
<td style='width:9em;text-align:center;font-weight:bold;'>{moment(bestellung.created_at).format("Y/m/d")}</td>
|
||||
<td style='width:8em;text-align:left;'>{bestellung["objekt_strasse"]}</td>
|
||||
<td style='width:5em;text-align:center;'>{bestellung["objekt_plz"]}</td>
|
||||
<td style='width:6em;text-align:left;'>{bestellung["objekt_ort"]}</td>
|
||||
<td style='width:3em;text-align:center;'>{bestellung['ausweisart']}</td>
|
||||
<td style='width:8em;text-align:right;'>{provisionBestellung} €</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</table>
|
||||
{/if}
|
||||
{/each}
|
||||
<!-- foreach ($period as $dt) {
|
||||
$year_month = $dt->format("Y-m");
|
||||
$month_name = $months[$dt->format("m")];
|
||||
if ((new DateTime(date("m/d/Y", strtotime($EEtimestamp))))->format("d") - (new DateTime(date("m/d/Y", strtotime($SStimestamp))))->format("d") == 1) {
|
||||
$Pall = $dt->format("d/m/Y") . ' bis ' . (new DateTime($today))->format("d/m/Y");
|
||||
} -->
|
||||
|
||||
|
||||
<!-- } -->
|
||||
@@ -70,7 +70,7 @@
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<a href="/dashboard/abrechnung" class="button ">Conversions</a>
|
||||
<a href="/dashboard/abrechnung" class="button ">Monatliche Abrechnung</a>
|
||||
</div>
|
||||
|
||||
<hr class="border-gray-600" />
|
||||
|
||||
@@ -1,11 +1,27 @@
|
||||
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import {
|
||||
AufnahmeClient,
|
||||
BedarfsausweisWohnenClient,
|
||||
BenutzerClient,
|
||||
BildClient,
|
||||
getAusweisartFromId,
|
||||
ObjektClient,
|
||||
RechnungClient,
|
||||
VerbrauchsausweisGewerbeClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
|
||||
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
||||
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
||||
import { pdfAushangVerbrauchsausweisGewerbe } from "#lib/pdf/pdfAushangVerbrauchsausweisGewerbe.js";
|
||||
import { Enums, prisma, Rechnung } from "#lib/server/prisma.js";
|
||||
|
||||
import {
|
||||
BedarfsausweisWohnen,
|
||||
Enums,
|
||||
prisma,
|
||||
Rechnung,
|
||||
VerbrauchsausweisGewerbe,
|
||||
VerbrauchsausweisWohnen,
|
||||
} from "#lib/server/prisma.js";
|
||||
|
||||
/**
|
||||
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
|
||||
@@ -15,68 +31,179 @@ export function getPrismaAusweisAdapter(id: string) {
|
||||
const ausweisart = getAusweisartFromId(id);
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
return prisma.verbrauchsausweisWohnen
|
||||
return prisma.verbrauchsausweisWohnen;
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
return prisma.verbrauchsausweisGewerbe
|
||||
return prisma.verbrauchsausweisGewerbe;
|
||||
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||
return prisma.bedarfsausweisWohnen
|
||||
return prisma.bedarfsausweisWohnen;
|
||||
} else if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
|
||||
return prisma.gEGNachweisWohnen
|
||||
return prisma.gEGNachweisWohnen;
|
||||
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
|
||||
return prisma.gEGNachweisGewerbe
|
||||
return prisma.gEGNachweisGewerbe;
|
||||
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
|
||||
return prisma.bedarfsausweisGewerbe
|
||||
return prisma.bedarfsausweisGewerbe;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt den richtigen Ansichtsausweis basierend auf der Ausweisart zurück.
|
||||
* @param ausweis
|
||||
* @param ausweis
|
||||
*/
|
||||
export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau: boolean = true, ausweisart = getAusweisartFromId(ausweis.id)) {
|
||||
export async function getAnsichtsausweis(
|
||||
ausweis:
|
||||
| VerbrauchsausweisWohnenClient
|
||||
| VerbrauchsausweisGewerbeClient
|
||||
| BedarfsausweisWohnenClient,
|
||||
aufnahme: AufnahmeClient,
|
||||
objekt: ObjektClient,
|
||||
bilder: BildClient[],
|
||||
user: BenutzerClient,
|
||||
vorschau: boolean = true,
|
||||
ausweisart = getAusweisartFromId(ausweis.id)
|
||||
) {
|
||||
if (!ausweisart) {
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user, vorschau)
|
||||
return await pdfVerbrauchsausweisWohnen(
|
||||
ausweis as VerbrauchsausweisWohnenClient,
|
||||
aufnahme,
|
||||
objekt,
|
||||
bilder,
|
||||
user,
|
||||
vorschau
|
||||
);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, vorschau)
|
||||
return await pdfVerbrauchsausweisGewerbe(
|
||||
ausweis as VerbrauchsausweisGewerbeClient,
|
||||
aufnahme,
|
||||
objekt,
|
||||
bilder,
|
||||
user,
|
||||
vorschau
|
||||
);
|
||||
}
|
||||
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt das richtige Datenblatt basierend auf der Ausweisart zurück.
|
||||
* @param ausweis
|
||||
* @param ausweis
|
||||
*/
|
||||
export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, rechnung: Rechnung, ausweisart = getAusweisartFromId(ausweis.id)) {
|
||||
export async function getDatenblatt(
|
||||
ausweis:
|
||||
| VerbrauchsausweisWohnenClient
|
||||
| VerbrauchsausweisGewerbeClient
|
||||
| BedarfsausweisWohnenClient,
|
||||
aufnahme: AufnahmeClient,
|
||||
objekt: ObjektClient,
|
||||
bilder: BildClient[],
|
||||
user: BenutzerClient,
|
||||
rechnung: Rechnung,
|
||||
ausweisart = getAusweisartFromId(ausweis.id)
|
||||
) {
|
||||
if (!ausweisart) {
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||
return await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, rechnung, bilder)
|
||||
return await pdfDatenblattVerbrauchsausweisWohnen(
|
||||
ausweis as VerbrauchsausweisWohnenClient,
|
||||
aufnahme,
|
||||
objekt,
|
||||
rechnung,
|
||||
bilder
|
||||
);
|
||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, rechnung, bilder)
|
||||
return await pdfDatenblattVerbrauchsausweisGewerbe(
|
||||
ausweis as VerbrauchsausweisGewerbeClient,
|
||||
aufnahme,
|
||||
objekt,
|
||||
rechnung,
|
||||
bilder
|
||||
);
|
||||
}
|
||||
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt den richtigen Aushang basierend auf der Ausweisart zurück.
|
||||
* @param ausweis
|
||||
* @param ausweis
|
||||
*/
|
||||
export async function getAushang(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau: boolean = true, rechnung: Rechnung, ausweisart = getAusweisartFromId(ausweis.id)) {
|
||||
export async function getAushang(
|
||||
ausweis:
|
||||
| VerbrauchsausweisWohnenClient
|
||||
| VerbrauchsausweisGewerbeClient
|
||||
| BedarfsausweisWohnenClient,
|
||||
aufnahme: AufnahmeClient,
|
||||
objekt: ObjektClient,
|
||||
bilder: BildClient[],
|
||||
user: BenutzerClient,
|
||||
vorschau: boolean = true,
|
||||
rechnung: Rechnung,
|
||||
ausweisart = getAusweisartFromId(ausweis.id)
|
||||
) {
|
||||
if (!ausweisart || !rechnung.services.includes(Enums.Service.Aushang)) {
|
||||
return null
|
||||
return null;
|
||||
}
|
||||
|
||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||
return await pdfAushangVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, vorschau)
|
||||
return await pdfAushangVerbrauchsausweisGewerbe(
|
||||
ausweis as VerbrauchsausweisGewerbeClient,
|
||||
aufnahme,
|
||||
objekt,
|
||||
bilder,
|
||||
user,
|
||||
vorschau
|
||||
);
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extrahiert die Ausweisfelder aus einem Objekt, das mehrere Ausweisarten enthält, und fasst sie in einem gemeinsamen Feld `ausweis` zusammen.
|
||||
* @param row Ein Objekt, das die Ausweisfelder enthält.
|
||||
* @returns Ein neues Objekt, das die Ausweisfelder extrahiert und in einem gemeinsamen Feld `ausweis` zusammenfasst.
|
||||
*/
|
||||
export function extrahiereAusweisAusFeldMitMehrerenAusweisen<T>(
|
||||
row: T & {
|
||||
bedarfsausweis_wohnen?: BedarfsausweisWohnen;
|
||||
verbrauchsausweis_wohnen?: VerbrauchsausweisWohnen;
|
||||
verbrauchsausweis_gewerbe?: VerbrauchsausweisGewerbe;
|
||||
}
|
||||
) {
|
||||
const {
|
||||
bedarfsausweis_wohnen,
|
||||
verbrauchsausweis_wohnen,
|
||||
verbrauchsausweis_gewerbe,
|
||||
...rest
|
||||
} = row;
|
||||
return {
|
||||
...rest,
|
||||
ausweis: {
|
||||
...(bedarfsausweis_wohnen ??
|
||||
verbrauchsausweis_wohnen ??
|
||||
verbrauchsausweis_gewerbe),
|
||||
ausweisart: bedarfsausweis_wohnen
|
||||
? Enums.Ausweisart.BedarfsausweisWohnen
|
||||
: verbrauchsausweis_wohnen
|
||||
? Enums.Ausweisart.VerbrauchsausweisWohnen
|
||||
: Enums.Ausweisart.VerbrauchsausweisGewerbe,
|
||||
},
|
||||
} as {
|
||||
ausweis: (
|
||||
| BedarfsausweisWohnen
|
||||
| VerbrauchsausweisWohnen
|
||||
| VerbrauchsausweisGewerbe
|
||||
) & { ausweisart: Enums.Ausweisart };
|
||||
} & Omit<
|
||||
T,
|
||||
| "bedarfsausweis_wohnen"
|
||||
| "verbrauchsausweis_wohnen"
|
||||
| "verbrauchsausweis_gewerbe"
|
||||
>;
|
||||
}
|
||||
|
||||
@@ -1156,7 +1156,7 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
|
||||
{/if}
|
||||
<!-- Für alle -->
|
||||
<div class="pruefpunkt">
|
||||
<input type="checkbox"/>
|
||||
<input type="checkbox" required/>
|
||||
<div class="text-left">
|
||||
Ich habe die AGB und DSGVO im <a href="/impressum#agb" target="_blank" rel="noopener noreferrer">Impressum</a> gelesen und akzeptiert.
|
||||
</div>
|
||||
|
||||
@@ -1,27 +1,28 @@
|
||||
---
|
||||
import AbrechungTable from "#components/Abrechnung/AbrechungTable.svelte";
|
||||
import AbrechnungTable from "#components/Abrechnung/AbrechnungTable.svelte";
|
||||
import BlankLayout from "#layouts/BlankLayout.astro";
|
||||
import { extrahiereAusweisAusFeldMitMehrerenAusweisen } from "#lib/server/ausweis";
|
||||
import { Enums, prisma } from "#lib/server/prisma";
|
||||
import { getCurrentUser } from "#lib/server/user";
|
||||
import moment from "moment";
|
||||
|
||||
const start = moment(Astro.url.searchParams.get("start"));
|
||||
const end = moment(Astro.url.searchParams.get("end"));
|
||||
|
||||
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();
|
||||
|
||||
let startdatum = start.toDate();
|
||||
let enddatum = end.toDate();
|
||||
|
||||
const benutzer = await getCurrentUser(Astro)
|
||||
const benutzer = await getCurrentUser(Astro);
|
||||
|
||||
if (!benutzer) {
|
||||
return Astro.redirect("/404")
|
||||
return Astro.redirect("/404");
|
||||
}
|
||||
|
||||
const provisionen={
|
||||
const provisionen = {
|
||||
[Enums.Ausweisart.VerbrauchsausweisWohnen]: 10,
|
||||
[Enums.Ausweisart.BedarfsausweisWohnen]: 10,
|
||||
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: 10,
|
||||
}
|
||||
};
|
||||
|
||||
// $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.
|
||||
@@ -30,305 +31,206 @@ if (start.isValid() && end.isValid()) {
|
||||
bestellungen = await prisma.rechnung.findMany({
|
||||
where: {
|
||||
partner_code: "immowelt",
|
||||
OR: [{
|
||||
verbrauchsausweis_gewerbe: {
|
||||
ausgestellt: true
|
||||
}
|
||||
},
|
||||
{
|
||||
bedarfsausweis_wohnen: {
|
||||
ausgestellt: true
|
||||
}
|
||||
},
|
||||
{
|
||||
verbrauchsausweis_wohnen: {
|
||||
ausgestellt: true
|
||||
}
|
||||
}],
|
||||
AND: [{
|
||||
created_at: {
|
||||
gte: startdatum
|
||||
OR: [
|
||||
{
|
||||
verbrauchsausweis_gewerbe: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
}, {
|
||||
created_at: {
|
||||
lte: enddatum
|
||||
{
|
||||
bedarfsausweis_wohnen: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
}]
|
||||
{
|
||||
verbrauchsausweis_wohnen: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
AND: [
|
||||
{
|
||||
created_at: {
|
||||
gte: startdatum,
|
||||
},
|
||||
},
|
||||
{
|
||||
created_at: {
|
||||
lte: enddatum,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
orderBy: {
|
||||
created_at: "desc"
|
||||
created_at: "desc",
|
||||
},
|
||||
include: {
|
||||
bedarfsausweis_wohnen: true,
|
||||
verbrauchsausweis_gewerbe: true,
|
||||
verbrauchsausweis_wohnen: true
|
||||
}
|
||||
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: "immowelt",
|
||||
OR: [{
|
||||
verbrauchsausweis_gewerbe: {
|
||||
ausgestellt: true
|
||||
}
|
||||
},
|
||||
{
|
||||
bedarfsausweis_wohnen: {
|
||||
ausgestellt: true
|
||||
}
|
||||
},
|
||||
{
|
||||
verbrauchsausweis_wohnen: {
|
||||
ausgestellt: true
|
||||
}
|
||||
}]
|
||||
OR: [
|
||||
{
|
||||
verbrauchsausweis_gewerbe: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
bedarfsausweis_wohnen: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
verbrauchsausweis_wohnen: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
orderBy: {
|
||||
created_at: "desc"
|
||||
created_at: "desc",
|
||||
},
|
||||
include: {
|
||||
bedarfsausweis_wohnen: true,
|
||||
verbrauchsausweis_gewerbe: true,
|
||||
verbrauchsausweis_wohnen: true
|
||||
}
|
||||
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?
|
||||
const partnerCodeErstesMal = (await prisma.rechnung.findFirst({
|
||||
select: {
|
||||
created_at: true
|
||||
},
|
||||
where: {
|
||||
partner_code: "immowelt",
|
||||
OR: [{
|
||||
verbrauchsausweis_gewerbe: {
|
||||
ausgestellt: true
|
||||
}
|
||||
},
|
||||
{
|
||||
bedarfsausweis_wohnen: {
|
||||
ausgestellt: true
|
||||
}
|
||||
},
|
||||
{
|
||||
verbrauchsausweis_wohnen: {
|
||||
ausgestellt: true
|
||||
}
|
||||
}],
|
||||
const partnerCodeErstesMal = (
|
||||
await prisma.rechnung.findFirst({
|
||||
select: {
|
||||
created_at: true,
|
||||
},
|
||||
where: {
|
||||
partner_code: "immowelt",
|
||||
OR: [
|
||||
{
|
||||
verbrauchsausweis_gewerbe: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
bedarfsausweis_wohnen: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
verbrauchsausweis_wohnen: {
|
||||
ausgestellt: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
created_at: {
|
||||
gte: moment().set("year", 2020).set("dayOfYear", 1).toDate()
|
||||
}
|
||||
},
|
||||
orderBy: {
|
||||
created_at: "asc"
|
||||
}
|
||||
}))?.created_at
|
||||
gte: moment().set("year", 2020).set("dayOfYear", 1).toDate(),
|
||||
},
|
||||
},
|
||||
orderBy: {
|
||||
created_at: "asc",
|
||||
},
|
||||
})
|
||||
)?.created_at;
|
||||
|
||||
let provision = 0;
|
||||
const ausweisarten: string[] = [];
|
||||
for (const bestellung of bestellungen) {
|
||||
if (bestellung.verbrauchsausweis_wohnen) {
|
||||
ausweisarten.push(Enums.Ausweisart.VerbrauchsausweisWohnen)
|
||||
provision += provisionen[Enums.Ausweisart.VerbrauchsausweisWohnen]
|
||||
ausweisarten.push(Enums.Ausweisart.VerbrauchsausweisWohnen);
|
||||
provision += provisionen[Enums.Ausweisart.VerbrauchsausweisWohnen];
|
||||
}
|
||||
if (bestellung.bedarfsausweis_wohnen) {
|
||||
ausweisarten.push(Enums.Ausweisart.BedarfsausweisWohnen)
|
||||
provision += provisionen[Enums.Ausweisart.BedarfsausweisWohnen]
|
||||
ausweisarten.push(Enums.Ausweisart.BedarfsausweisWohnen);
|
||||
provision += provisionen[Enums.Ausweisart.BedarfsausweisWohnen];
|
||||
}
|
||||
if (bestellung.verbrauchsausweis_gewerbe) {
|
||||
ausweisarten.push(Enums.Ausweisart.VerbrauchsausweisGewerbe)
|
||||
provision += provisionen[Enums.Ausweisart.VerbrauchsausweisGewerbe]
|
||||
ausweisarten.push(Enums.Ausweisart.VerbrauchsausweisGewerbe);
|
||||
provision += provisionen[Enums.Ausweisart.VerbrauchsausweisGewerbe];
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
<BlankLayout title="Monatliche Abrechnung">
|
||||
<AbrechnungTable
|
||||
bestellungen={bestellungen.map((bestellung) =>
|
||||
extrahiereAusweisAusFeldMitMehrerenAusweisen(bestellung)
|
||||
)}
|
||||
{provisionen}
|
||||
{partnerCodeErstesMal}
|
||||
startDate={startdatum}
|
||||
endDate={enddatum}
|
||||
email={benutzer.email}
|
||||
client:load
|
||||
/>
|
||||
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Reporting | online-energieausweis.org</title>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
|
||||
<link rel="stylesheet" href="./main.css">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
||||
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
||||
</head>
|
||||
|
||||
<style>
|
||||
body {
|
||||
font-family: arial;
|
||||
}
|
||||
|
||||
#inputwrap {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 10%;
|
||||
width: 70%;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#cal {
|
||||
margin-right: 10px !important;
|
||||
}
|
||||
|
||||
#demo {
|
||||
width: 76%;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
table tr,
|
||||
td {
|
||||
border: 0.1em solid #000;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#QTT {
|
||||
border-collapse: collapse;
|
||||
width: 70%;
|
||||
margin-top: 8em;
|
||||
margin-left: 10%;
|
||||
table-layout: auto;
|
||||
}
|
||||
|
||||
#QTT thead td {
|
||||
background: #ff7d26;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#QTT tr:nth-child(even) {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
#QTT td {
|
||||
padding: 0.4em 0.4em 0.4em 0.4em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#logo1 {
|
||||
display: inline-block;
|
||||
margin-right: 1em;
|
||||
margin-top: -3px;
|
||||
}
|
||||
|
||||
#logo2 {
|
||||
width: 18%;
|
||||
margin-bottom: 0.5em;
|
||||
float: right;
|
||||
padding-top: -1px;
|
||||
margin-right: -5px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
|
||||
<div id='inputwrap' class='form-group' >
|
||||
<div style='display:flex; justify-content: space-between; align-items:center;'>
|
||||
<img id='logo1' src='https://widget.ib-cornelsen.de/OEA_WIDGETS/img/IBC-logo.png' alt='IBCornelsen' />
|
||||
<h5 style='margin-top: 10px;'><b>Erziehlte Conversions von {benutzer.email}</b></h5>
|
||||
</div>
|
||||
<input type='text' id='demo' class='form-control' name='demo' value='' placeholder='Bitte Zeitraum auswählen' />
|
||||
</div>
|
||||
|
||||
<AbrechungTable bestellungen={bestellungen} {provisionen} {partnerCodeErstesMal}></AbrechungTable>
|
||||
|
||||
|
||||
<div id="total" class="footer">
|
||||
<div class="inner">
|
||||
<div>
|
||||
<p id="betrag_gesamt">Abrechnungsbetrag gesamt: <b>{provision} €</b></p>
|
||||
<div class="fixed bottom-0 left-0 right-0 bg-white p-4 shadow">
|
||||
<div class="flex justify-between items-center">
|
||||
<div>
|
||||
<p id="betrag_gesamt">
|
||||
Abrechnungsbetrag gesamt: <b>{provision} €</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=`/user/abrechnung/pdf.php?month=${moment().subtract(1, "month").get("month")}&year=${moment().subtract(1, "month").get("year")}`
|
||||
>PDF für letzten Monat generieren.</a
|
||||
>
|
||||
</div>
|
||||
<a target='_blank' rel='noreferrer noopener' href=`/user/abrechnung/pdf.php?month=${moment().subtract(1, "month").get("month")}&year=${moment().subtract(1, "month").get("year")}`>PDF für letzten Monat generieren.</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
$('#demo').daterangepicker({
|
||||
"showDropdowns": true,
|
||||
"minYear": 2019,
|
||||
ranges: {
|
||||
'Heute': [moment(), moment()],
|
||||
'Gestern': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
|
||||
'letzte 7 Tage': [moment().subtract(6, 'days'), moment()],
|
||||
'letzte 30 Tage': [moment().subtract(29, 'days'), moment()],
|
||||
'dieser Monat': [moment().startOf('month'), moment().endOf('month')],
|
||||
'letzter Monat': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
|
||||
},
|
||||
"locale": {
|
||||
"format": "DD/MM/YYYY",
|
||||
"separator": " - ",
|
||||
"applyLabel": "Übernehmen",
|
||||
"cancelLabel": "Abrechen",
|
||||
"fromLabel": "Von",
|
||||
"toLabel": "Bis",
|
||||
"customRangeLabel": "Benutzerdefiniert",
|
||||
"weekLabel": "W",
|
||||
"daysOfWeek": [
|
||||
"So",
|
||||
"Mo",
|
||||
"Di",
|
||||
"Mi",
|
||||
"Do",
|
||||
"Fr",
|
||||
"Sa"
|
||||
],
|
||||
"monthNames": [
|
||||
"Januar",
|
||||
"Februar",
|
||||
"März",
|
||||
"April",
|
||||
"Mai",
|
||||
"Juni",
|
||||
"Juli",
|
||||
"August",
|
||||
"September",
|
||||
"Oktober",
|
||||
"November",
|
||||
"Dezember"
|
||||
],
|
||||
"firstDay": 1
|
||||
},
|
||||
"autoUpdateInput": false,
|
||||
"alwaysShowCalendars": true,
|
||||
"startDate": "<?php echo $day_start_display; ?>",
|
||||
"endDate": "<?php echo $day_end_display; ?>",
|
||||
"minDate": "01/10/2019"
|
||||
}, function(start, end, label) {
|
||||
var Pstart = start.format('MM/DD/YYYY');
|
||||
var Pend = end.format('MM/DD/YYYY');
|
||||
|
||||
$("#start").val(Pstart);
|
||||
$("#end").val(Pend);
|
||||
|
||||
$('#FO').submit();
|
||||
|
||||
});
|
||||
|
||||
// $("#demo").val(`Conversions im Zeitraum: <?php echo $Pall; ?>`);
|
||||
</script>
|
||||
|
||||
|
||||
<body>
|
||||
<form id='FO' method='GET' action='index.php'>
|
||||
<input type="hidden" id="start" name="start" value='' />
|
||||
<input type="hidden" id="end" name="end" value='' />
|
||||
</form>
|
||||
|
||||
<script>
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</BlankLayout>
|
||||
|
||||
Reference in New Issue
Block a user