Admin Tools
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
import { Enums, Objekt } from "#lib/client/prisma.js";
|
import { Enums, Objekt } from "#lib/client/prisma.js";
|
||||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||||
import { shortenUID } from "#server/lib/hash.js";
|
import { shortenUID } from "#server/lib/hash.js";
|
||||||
|
import { addNotification } from "#components/Notifications/shared.js";
|
||||||
|
|
||||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||||
export let aufnahme: AufnahmeKomplettClient;
|
export let aufnahme: AufnahmeKomplettClient;
|
||||||
@@ -91,6 +92,75 @@
|
|||||||
calculations = endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt);
|
calculations = endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function registriernummerAnfordern() {
|
||||||
|
try {
|
||||||
|
const result = await api.admin.registriernummer.GET.fetch({
|
||||||
|
uid: ausweis.uid
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch(e) {
|
||||||
|
addNotification({
|
||||||
|
message: "Registriernummer anfordern fehlgeschlagen.",
|
||||||
|
subtext: e as string,
|
||||||
|
type: "error",
|
||||||
|
dismissable: true,
|
||||||
|
timeout: 3000,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function stornieren() {
|
||||||
|
try {
|
||||||
|
const response = await api.admin.stornieren.PUT.fetch({
|
||||||
|
uid_ausweis: ausweis.uid
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
addNotification({
|
||||||
|
message: "Ausweis wurde storniert",
|
||||||
|
type: "success",
|
||||||
|
dismissable: true,
|
||||||
|
timeout: 3000,
|
||||||
|
})
|
||||||
|
|
||||||
|
ausweis.storniert = true;
|
||||||
|
ausweis = ausweis;
|
||||||
|
} catch(e) {
|
||||||
|
addNotification({
|
||||||
|
message: "Ausweis konnte nicht storniert werden.",
|
||||||
|
subtext: e as string,
|
||||||
|
type: "error",
|
||||||
|
dismissable: true,
|
||||||
|
timeout: 3000,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function ausweisAusstellen() {
|
||||||
|
try {
|
||||||
|
await api.admin.ausstellen.GET.fetch({
|
||||||
|
uid_ausweis: ausweis.uid
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch(e) {
|
||||||
|
addNotification({
|
||||||
|
message: "Das hat nicht geklappt.",
|
||||||
|
subtext: e as string,
|
||||||
|
timeout: 3000,
|
||||||
|
type: "error",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mr-4">
|
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mr-4">
|
||||||
@@ -222,7 +292,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{/await}
|
{/await}
|
||||||
|
|
||||||
<div class="flex flex-row justify-end gap-4 mt-4">
|
<div class="flex flex-row justify-end items-center gap-4 mt-4">
|
||||||
{#if !ausweis.storniert && !ausweis.ausgestellt}
|
{#if !ausweis.storniert && !ausweis.ausgestellt}
|
||||||
<!--
|
<!--
|
||||||
<a
|
<a
|
||||||
@@ -266,6 +336,12 @@
|
|||||||
>Formular</a>
|
>Formular</a>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
||||||
|
<button class="button text-sm" on:click={ausweisAusstellen}>A</button>
|
||||||
|
<button class="button text-sm" on:click={stornieren}>S</button>
|
||||||
|
<button class="button text-sm" on:click={registriernummerAnfordern}>R</button>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<a
|
<a
|
||||||
class="p-2 rounded-lg hover:bg-gray-200"
|
class="p-2 rounded-lg hover:bg-gray-200"
|
||||||
@@ -273,7 +349,15 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
href="/pdf/ansichtsausweis?uid={ausweis.uid}"
|
href="/pdf/ansichtsausweis?uid={ausweis.uid}"
|
||||||
>
|
>
|
||||||
<Download size={22} />
|
<img src="/images/ausweis.webp" width="32" alt="Energieausweis">
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
class="p-2 rounded-lg hover:bg-gray-200"
|
||||||
|
title="PDF Herunterladen"
|
||||||
|
target="_blank"
|
||||||
|
href="/pdf/datenblatt?uid={ausweis.uid}"
|
||||||
|
>
|
||||||
|
<img src="/images/datenblatt.webp" width="32" alt="Datenblatt">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
class="flex p-2 hover:bg-gray-200 rounded-lg">
|
class="flex p-2 hover:bg-gray-200 rounded-lg">
|
||||||
<ChevronLeft></ChevronLeft>
|
<ChevronLeft></ChevronLeft>
|
||||||
</a>
|
</a>
|
||||||
<p>{current} of {pages}</p>
|
<p>{current} von {pages}</p>
|
||||||
<a href={next}
|
<a href={next}
|
||||||
class:disabled={current === pages ? true : false}
|
class:disabled={current === pages ? true : false}
|
||||||
aria-label="right arrow icon"
|
aria-label="right arrow icon"
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { AufnahmeKomplettClient, BenutzerClient } from "#components/Ausweis/types.js";
|
import { AufnahmeKomplettClient, BenutzerClient } from "#components/Ausweis/types.js";
|
||||||
|
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
|
||||||
import Carousel from "#components/Carousel.svelte";
|
import Carousel from "#components/Carousel.svelte";
|
||||||
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||||
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte";
|
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte";
|
||||||
|
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
||||||
import { Objekt } from "#lib/client/prisma.js";
|
import { Objekt } from "#lib/client/prisma.js";
|
||||||
import { ChevronLeft, ChevronRight } from "radix-svelte-icons";
|
import { ChevronLeft, ChevronRight } from "radix-svelte-icons";
|
||||||
|
|
||||||
@@ -76,4 +78,8 @@
|
|||||||
{#each aufnahme.geg_nachweise_wohnen as nachweis}
|
{#each aufnahme.geg_nachweise_wohnen as nachweis}
|
||||||
<DashboardNachweis {nachweis} {aufnahme} {objekt}></DashboardNachweis>
|
<DashboardNachweis {nachweis} {aufnahme} {objekt}></DashboardNachweis>
|
||||||
{/each}
|
{/each}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
|
||||||
|
<NotificationProvider component={AusweisPruefenNotification}></NotificationProvider>
|
||||||
</div>
|
</div>
|
||||||
@@ -13,9 +13,16 @@
|
|||||||
import { addNotification } from "#components/Notifications/shared.js";
|
import { addNotification } from "#components/Notifications/shared.js";
|
||||||
import Cookies from "js-cookie";
|
import Cookies from "js-cookie";
|
||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
|
import Pagination from "#components/Pagination.svelte";
|
||||||
|
import AusweisePruefenFilter from "#components/Dashboard/AusweisePruefenFilter.svelte";
|
||||||
|
import { filterAusweise } from "#lib/filters.js";
|
||||||
|
import { z, ZodTypeAny } from "zod";
|
||||||
|
import { Enums } from "#lib/client/prisma.js";
|
||||||
|
|
||||||
export let user: BenutzerClient;
|
export let user: BenutzerClient;
|
||||||
export let objekte: ObjektKomplettClient[];
|
export let objekte: ObjektKomplettClient[];
|
||||||
|
export let page: number;
|
||||||
|
export let totalPages: number;
|
||||||
|
|
||||||
let objektOverlayHidden = true;
|
let objektOverlayHidden = true;
|
||||||
|
|
||||||
@@ -85,24 +92,34 @@
|
|||||||
|
|
||||||
objekte = objekte
|
objekte = objekte
|
||||||
}
|
}
|
||||||
|
let filters: { name: keyof z.infer<typeof filterAusweise>, type: ZodTypeAny, value: any }[] = []
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<h1>Gebäudeübersicht</h1>
|
<h1>Gebäudeübersicht</h1>
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
|
{#if user.rolle === Enums.BenutzerRolle.ADMIN}
|
||||||
|
<div class="flex flex-col mb-4">
|
||||||
|
<AusweisePruefenFilter bind:filters={filters}></AusweisePruefenFilter>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div class="relative mb-6">
|
<div class="relative mb-6">
|
||||||
<button class="button" on:click={() => {
|
<button class="button" on:click={() => {
|
||||||
objektOverlayHidden = false
|
objektOverlayHidden = false
|
||||||
}}> Gebäude anlegen + </button>
|
}}> Gebäude anlegen + </button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="columns columns-1 md:columns-2 lg:columns-3 gap-4">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||||
{#each objekte as objekt}
|
{#each objekte as objekt}
|
||||||
<DashboardObjekt {objekt}></DashboardObjekt>
|
<DashboardObjekt {objekt}></DashboardObjekt>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<Pagination pages={totalPages} current={page} prev="/dashboard/objekte/{page - 1}" next="/dashboard/objekte/{page + 1}"></Pagination>
|
||||||
|
|
||||||
|
|
||||||
<Overlay bind:hidden={objektOverlayHidden}>
|
<Overlay bind:hidden={objektOverlayHidden}>
|
||||||
<div class="bg-white w-full max-w-screen-sm px-4 py-6 flex flex-col gap-4">
|
<div class="bg-white w-full max-w-screen-sm px-4 py-6 flex flex-col gap-4">
|
||||||
<h2 class="p-0 m-0">Gebäude erstellen</h2>
|
<h2 class="p-0 m-0">Gebäude erstellen</h2>
|
||||||
|
|||||||
@@ -72,9 +72,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let waitOverlayHidden = true;
|
|
||||||
let speichernOverlayHidden = true;
|
|
||||||
|
|
||||||
$: {
|
$: {
|
||||||
localStorage.setItem("verbrauchsausweis-gewerbe.ausweis", JSON.stringify(ausweis))
|
localStorage.setItem("verbrauchsausweis-gewerbe.ausweis", JSON.stringify(ausweis))
|
||||||
localStorage.setItem("verbrauchsausweis-gewerbe.aufnahme", JSON.stringify(aufnahme))
|
localStorage.setItem("verbrauchsausweis-gewerbe.aufnahme", JSON.stringify(aufnahme))
|
||||||
|
|||||||
@@ -1,53 +1,3 @@
|
|||||||
---
|
---
|
||||||
import { createCaller } from "../../astro-typesafe-api-caller.js";
|
return Astro.redirect("/dashboard/objekte/1", 301);
|
||||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
---
|
||||||
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
|
||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
|
||||||
import { Enums, prisma } from "#lib/server/prisma";
|
|
||||||
import DashboardLayout from "#layouts/DashboardLayout.astro";
|
|
||||||
|
|
||||||
const accessTokenValid = await validateAccessTokenServer(Astro);
|
|
||||||
|
|
||||||
if (!accessTokenValid) {
|
|
||||||
return Astro.redirect("/auth/login")
|
|
||||||
}
|
|
||||||
|
|
||||||
const caller = createCaller(Astro);
|
|
||||||
|
|
||||||
const user = await caller.user.self.GET.fetch(undefined, {
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
return Astro.redirect("/auth/login")
|
|
||||||
}
|
|
||||||
|
|
||||||
const objekte = await prisma.objekt.findMany({
|
|
||||||
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
|
||||||
benutzer: {
|
|
||||||
uid: user.uid
|
|
||||||
}
|
|
||||||
} : {},
|
|
||||||
take: 25,
|
|
||||||
orderBy: {
|
|
||||||
erstellungsdatum: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
|
||||||
aufnahmen: {
|
|
||||||
include: {
|
|
||||||
bilder: true,
|
|
||||||
unterlagen: true,
|
|
||||||
bedarfsausweise_wohnen: true,
|
|
||||||
verbrauchsausweise_gewerbe: true,
|
|
||||||
verbrauchsausweise_wohnen: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
---
|
|
||||||
|
|
||||||
<DashboardLayout title="Dashboard" {user}>
|
|
||||||
<DashboardModule {user} {objekte} client:load />
|
|
||||||
</DashboardLayout>
|
|
||||||
58
src/pages/dashboard/objekte/[page].astro
Normal file
58
src/pages/dashboard/objekte/[page].astro
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||||
|
import { Enums, prisma } from "#lib/server/prisma";
|
||||||
|
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||||
|
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||||
|
|
||||||
|
const caller = createCaller(Astro)
|
||||||
|
|
||||||
|
const params = Astro.params;
|
||||||
|
const page = Number(params.page)
|
||||||
|
|
||||||
|
const user = await caller.user.self.GET.fetch(undefined, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
return Astro.redirect("/auth/login")
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalPages = await prisma.objekt.count({
|
||||||
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
|
benutzer: {
|
||||||
|
uid: user.uid
|
||||||
|
}
|
||||||
|
} : {}
|
||||||
|
})
|
||||||
|
|
||||||
|
const objekte = await prisma.objekt.findMany({
|
||||||
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
|
benutzer: {
|
||||||
|
uid: user.uid
|
||||||
|
}
|
||||||
|
} : {},
|
||||||
|
orderBy: {
|
||||||
|
erstellungsdatum: "desc"
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
aufnahmen: {
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
unterlagen: true,
|
||||||
|
bedarfsausweise_wohnen: true,
|
||||||
|
verbrauchsausweise_gewerbe: true,
|
||||||
|
verbrauchsausweise_wohnen: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
take: 25,
|
||||||
|
skip: (page - 1) * 25
|
||||||
|
})
|
||||||
|
---
|
||||||
|
|
||||||
|
<UserLayout title="Ausweise Prüfen" {user}>
|
||||||
|
<DashboardModule {user} {objekte} totalPages={Math.ceil(totalPages / 25)} page={page} client:load />
|
||||||
|
</UserLayout>
|
||||||
@@ -1 +1 @@
|
|||||||
{"12361536":true,"12361537":true,"12361539":true,"12361543":true,"12361544":true,"12361548":true,"12361549":true,"12361552":true,"12361554":true,"12361557":true,"12361558":true,"12361560":true,"12361563":true,"12361565":true,"12361566":true,"12361567":true,"12361569":true,"12361570":true,"12361571":true,"12361573":true,"12361575":true,"12361576":true,"12361577":true,"12361578":true,"12361579":true,"12361581":true,"12361582":true,"12361583":true,"12361584":true,"12361587":true,"12361588":true,"12361589":true,"12361591":true,"12361593":true,"12361594":true,"12361595":true,"12361596":true,"12361597":true,"12361602":true,"12361603":true,"12361604":true,"12361605":true,"12361606":true,"12361607":true,"12361608":true,"12361611":true,"12361613":true,"12361614":true,"12361616":true,"12361619":true,"12361620":true,"12361639":true,"12361643":true,"12361644":true,"12361645":true,"12361648":true,"12361652":true,"12361654":true,"12361658":true,"12361659":true,"12361660":true,"12361661":true,"12361662":true,"12361663":true,"12361664":true,"12361668":true,"12361669":true,"12361672":true,"12361673":true,"12361674":true,"12361678":true,"12361688":true,"12361689":true,"12361690":true,"12361695":true,"12361699":true,"12361702":true,"12361704":true,"12361705":true,"12361708":true,"12361709":true,"12361710":true,"12361714":true,"12361715":true,"12361718":true,"12361719":true,"12361737":true,"12361744":true,"12361747":true,"12361754":true,"12361755":true,"12361759":true,"12361760":true,"12361761":true,"12361762":true,"12361763":true,"12361766":true,"12361767":true,"12361769":true,"12361771":true,"12361772":true,"12361773":true,"12361774":true,"12361775":true,"12361779":true,"12361781":true,"12361784":true,"12361785":true,"12361789":true,"12361791":true,"12361793":true,"12361795":true,"12361796":true,"12361798":true,"12361799":true,"12361803":true,"12361806":true,"12361807":true,"12361808":true,"12361809":true,"12361810":true,"12361811":true,"12361812":true,"12361813":true,"12361814":true,"12361815":true,"12361816":true,"12361817":true,"12361819":true,"12361821":true,"12361822":true,"12361823":true,"12361824":true,"12361827":true,"12361828":true,"12361830":true,"12361832":true,"12361835":true,"12361836":true,"12361837":true,"12361843":true,"12361844":true,"12361849":true,"12361851":true,"12361854":true,"12361858":true,"12361859":true,"12361860":true,"12361862":true,"12361864":true,"12361865":true,"12361868":true,"12361872":true,"12361874":true,"12361876":true,"12361877":true,"12361878":true,"12361880":true,"12361881":true,"12361882":true,"12361883":true,"12361884":true,"12361887":true,"12361891":true,"12361894":true,"12361897":true,"12361899":true,"12361900":true,"12361901":true,"12361902":true,"12361903":true,"12361904":true,"12361906":true,"12361907":true,"12361910":true,"12361911":true,"12361913":true,"12361915":true,"12361917":true,"12361918":true,"12361920":true,"12361921":true,"12361922":true,"12361924":true,"12361926":true,"12361927":true,"12361928":true,"12361929":true,"12361930":true,"12361933":true,"12361934":true,"12361939":true,"12361941":true,"12361942":true,"12361943":true,"12361945":true,"12361948":true,"12361949":true,"12361951":true,"12361953":true,"12361960":true,"12361961":true,"12361962":true,"12361964":true,"12361965":true,"12361966":true,"12361967":true,"12361968":true,"12361973":true,"12361974":true,"12361977":true,"12361978":true,"12361980":true,"12361987":true,"12361990":true,"12361992":true,"12362021":true,"12362022":true,"12362023":true,"12362025":true,"12362027":true,"12362028":true,"12362029":true,"12362030":true,"12362031":true,"12362032":true,"12362033":true,"12362034":true,"12362035":true}
|
{"12362023":true,"12362027":true,"12362028":true,"12362030":true,"12362031":true,"12362032":true,"12362035":true}
|
||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user