Dashboard, Types und Formular

This commit is contained in:
Moritz Utcke
2024-02-27 12:52:45 +07:00
parent 982a739346
commit 1db59c3792
16 changed files with 267 additions and 238 deletions

View File

@@ -19,9 +19,9 @@ export type UploadedGebaeudeBild = Omit<
* @export * @export
* @typedef {VerbrauchsausweisWohnenClient} * @typedef {VerbrauchsausweisWohnenClient}
*/ */
export type VerbrauchsausweisWohnenClient = inferProcedureInput< export type VerbrauchsausweisWohnenClient = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["2016"]["speichern"] AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["ausweis"]; >;
/** /**
* Das ist der Typescript Type für den Verbrauchsausweis Gewerbe mit allen Feldern die * Das ist der Typescript Type für den Verbrauchsausweis Gewerbe mit allen Feldern die
@@ -63,12 +63,13 @@ export type BedarfsausweisWohnenClient = inferProcedureInput<
* @export * @export
* @typedef {GebaeudeClient} * @typedef {GebaeudeClient}
*/ */
export type GebaeudeClient = inferProcedureInput< export type GebaeudeClient = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["2016"]["speichern"] AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["gebaeude"]; >["gebaeude_aufnahme_allgemein"]["gebaeude_stammdaten"];
export type GebaeudeAufnahmeClient = inferProcedureInput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["2016"]["speichern"] export type GebaeudeAufnahmeClient = inferProcedureOutput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["get"]
>["gebaeude_aufnahme_allgemein"]; >["gebaeude_aufnahme_allgemein"];
export type BenutzerClient = inferProcedureOutput<AppRouter["v1"]["benutzer"]["fromPublicId"]> export type BenutzerClient = inferProcedureOutput<AppRouter["v1"]["benutzer"]["fromPublicId"]>

View File

@@ -1,8 +1,6 @@
<script lang="ts"> <script lang="ts">
import { import {
GebaeudeAufnahmeClient, VerbrauchsausweisWohnenClient,
GebaeudeClient,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types"; } from "#components/Ausweis/types";
import moment from "moment"; import moment from "moment";
import { dialogs } from "svelte-dialogs"; import { dialogs } from "svelte-dialogs";
@@ -14,18 +12,15 @@
QuestionMarkCircled, QuestionMarkCircled,
} from "radix-svelte-icons"; } from "radix-svelte-icons";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
import { GebaeudeBilder } from "@ibcornelsen/database/client"; import { client } from "src/trpc";
import { verbrauchsausweisWohnenCalculateFormProgress } from "#lib/VerbrauchsausweisWohnen/calculateFormProgress";
export let ausweis: VerbrauchsausweisWohnenClient & { import { number } from "zod";
gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient & {
gebaeude_stammdaten: GebaeudeClient & { export let ausweis: VerbrauchsausweisWohnenClient;
gebaeude_bilder: GebaeudeBilder[]; export let progress: number;
};
};
};
async function ausweisStornieren() { async function ausweisStornieren() {
const result = dialogs.confirm({ const result = await dialogs.confirm({
title: "Ausweis Stornieren", title: "Ausweis Stornieren",
text: "Sind sie sich sicher, dass sie den Ausweis stornieren möchten? Diese Operation kann nicht rückgängig gemacht werden!", text: "Sind sie sich sicher, dass sie den Ausweis stornieren möchten? Diese Operation kann nicht rückgängig gemacht werden!",
confirmButtonText: "Ausweis Stornieren", confirmButtonText: "Ausweis Stornieren",
@@ -39,20 +34,37 @@
footerClass: "bg-base-100 justify-center gap-4 mt-4", footerClass: "bg-base-100 justify-center gap-4 mt-4",
}); });
// TODO: Ausweis Stornieren falls result == true if (result === true) {
await client.v1.verbrauchsausweisWohnen.stornieren.mutate({
uid: ausweis.uid
})
ausweis.gebaeude_aufnahme_allgemein.storniert = true;
ausweis = ausweis;
dialogs.alert({
title: "Ausweis Storniert",
text: "Der Ausweis wurde erfolgreich storniert.",
dismissButtonText: "Schließen",
dismissButtonClass: "btn btn-primary",
dialogClass: "modal-box",
headerClass: "bg-base-100 text-center",
titleClass: "text-base-content text-xl font-medium",
dividerClass: "hidden",
footerClass: "bg-base-100 justify-center gap-4 mt-4",
});
}
} }
let hilfeModal: HTMLDialogElement; let hilfeModal: HTMLDialogElement;
</script> </script>
<div class="card lg:card-side bg-base-200 card-bordered border-base-300"> <div class="card lg:card-side bg-base-200 card-bordered border-base-300">
<!-- {#if ausweis.gebaeude_aufnahme_allgemein.storniert}
TODO: Storniert Feld hinzufügen <div class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none">
{#if ausweis.storniert} <h1 class="absolute -rotate-[25deg] text-7xl tracking-wide uppercase text-red-500 border-4 border-red-500 rounded-lg top-[50%] translate-y-[-50%] left-[50%] translate-x-[-50%]">Storniert</h1>
<div class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none"> </div>
<h1 class="absolute -rotate-[25deg] text-7xl tracking-wide uppercase text-red-500 border-4 border-red-500 rounded-lg top-[50%] translate-y-[-50%] left-[50%] translate-x-[-50%]">Storniert</h1> {/if}
</div>
{/if} -->
<figure class="lg:w-1/2"> <figure class="lg:w-1/2">
<img <img
src={(ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder && `/bilder/${ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder[0]?.uid}.webp`) || "/images/placeholder.jpg"} src={(ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder && `/bilder/${ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder[0]?.uid}.webp`) || "/images/placeholder.jpg"}
@@ -85,16 +97,29 @@
</ul> </ul>
</div> </div>
<div class="flex flex-row flex-wrap gap-2"> <div class="flex flex-row flex-wrap gap-2">
{#if ausweis.ausweisart == "VerbrauchsausweisWohnen"}
<div class="badge badge-accent font-semibold"> <div class="badge badge-accent font-semibold">
Verbrauchsausweis Verbrauchsausweis Wohnen
</div> </div>
{:else if ausweis.ausweisart == "BedarfsausweisWohnen"}
<div class="badge badge-accent font-semibold">
Bedarfsausweis Wohnen
</div>
{:else if ausweis.ausweisart == "VerbrauchsausweisGewerbe"}
<div class="badge badge-accent font-semibold">
Verbrauchsausweis Gewerbe
</div>
{/if}
{#if ausweis.erledigt}
<div class="badge badge-success font-semibold">Ausgestellt</div> <div class="badge badge-success font-semibold">Ausgestellt</div>
{/if}
</div> </div>
<h2 class="card-title">{ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.adresse}</h2> <h2 class="card-title">{ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.adresse}</h2>
<div class="mb-4 flex flex-row items-center gap-4"> <div class="mb-4 flex flex-row items-center gap-4">
<progress class="progress w-full" value="54" max="100"></progress> <progress class="progress w-full" value={progress} max="100"></progress>
<!-- TODO: Metrics für den Fortschritt festlegen --> <!-- TODO: Metrics für den Fortschritt festlegen -->
<span class="text-sm font-semibold text-base-content">54%</span> <span class="text-sm font-semibold text-base-content">{progress}%</span>
</div> </div>
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis)} {#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis)}

View File

@@ -18,7 +18,7 @@
{#if image.kategorie == kategorie} {#if image.kategorie == kategorie}
<div class="relative group"> <div class="relative group">
<img <img
src={image.base64} src="/bilder/{image.uid}.webp"
alt={kategorie} alt={kategorie}
class="h-full rounded-lg border-2 group-hover:contrast-50 object-cover transition-all" class="h-full rounded-lg border-2 group-hover:contrast-50 object-cover transition-all"
/> />

View File

@@ -6,7 +6,7 @@
export let name: string; export let name: string;
export let readonly: boolean = false; export let readonly: boolean = false;
export let city: string | null; export let city: string | null | undefined;
export let zip: string | null = ""; export let zip: string | null = "";

View File

@@ -1,18 +1,7 @@
import { GebaeudeAufnahmeClient } from "#components/Ausweis/types"; import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { VerbrauchsausweisWohnen, Benutzer, GebaeudeStammdaten, Rechnungen, GebaeudeBilder } from "@ibcornelsen/database/client";
export type AusweisData = VerbrauchsausweisWohnen & {
benutzer: Benutzer;
gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient & {
gebaeude_stammdaten: GebaeudeStammdaten & {
gebaeude_bilder: GebaeudeBilder[];
}
}
rechnungen: Rechnungen;
};
export function convertAusweisData( export function convertAusweisData(
inputs: AusweisData inputs: VerbrauchsausweisWohnenClient
): Record<string, string> { ): Record<string, string> {
return { return {
"gebaeude_stammdaten.adresse": inputs.gebaeude_aufnahme_allgemein.adresse || "", "gebaeude_stammdaten.adresse": inputs.gebaeude_aufnahme_allgemein.adresse || "",

View File

@@ -0,0 +1,64 @@
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
type AusweisError = {
title: string,
description: string,
severity: "error" | "warning",
resolvehref?: string
}
/**
* Berechnet den Fortschritt im Formular anhand bestimmter Faktoren
* Gibt den Fortschritt in Prozent zurück.
* @param ausweis Der Verbrauchsausweis
* @returns Der Fortschritt in Prozent sowie ein Array mit gefundenen Fehlern
*/
export function verbrauchsausweisWohnenCalculateFormProgress(ausweis: VerbrauchsausweisWohnenClient): {
progress: number;
errors: AusweisError[];
} {
let progress = 0;
const errors: AusweisError[] = [];
if (ausweis.erledigt) {
// Der Ausweis wurde ausgestellt, also ist der Fortschritt 100%
return {
progress: 100,
errors: []
};
} else if (ausweis.gebaeude_aufnahme_allgemein.storniert) {
// Der Ausweis wurde storniert, also ist der Fortschritt 0%
return {
progress: 0,
errors: []
};
}
if (ausweis.gebaeude_aufnahme_allgemein.baujahr_gebaeude.length === 0) {
errors.push({
title: "Fehlendes Baujahr",
description: "Eines ihrer Gebäude hat noch kein Baujahr angegeben. Beheben sie dies indem sie auf den untenstehenden Link klicken.",
severity: "warning",
resolvehref: `/energieausweis-erstellen/verbrauchsausweis-wohnen?uid=${ausweis.uid}`
});
}
if (ausweis.gebaeude_aufnahme_allgemein.adresse) {
progress += 5;
}
if (ausweis.gebaeude_aufnahme_allgemein.ort) {
progress += 5;
}
if (ausweis.verbrauch_1 && ausweis.verbrauch_2 && ausweis.verbrauch_3) {
progress += 5;
}
return {
progress,
errors
};
}

View File

@@ -19,35 +19,39 @@
import Overlay from "#components/Overlay.svelte"; import Overlay from "#components/Overlay.svelte";
import AusweisGespeichertModule from "./AusweisGespeichertModule.svelte"; import AusweisGespeichertModule from "./AusweisGespeichertModule.svelte";
import { validateAccessTokenClient } from "src/client/lib/validateAccessToken"; import { validateAccessTokenClient } from "src/client/lib/validateAccessToken";
import { UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, GebaeudeClient, BenutzerClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types"; import { VerbrauchsausweisWohnenClient, BenutzerClient } from "#components/Ausweis/types";
import { dialogs } from "svelte-dialogs"; import { dialogs } from "svelte-dialogs";
import LoginDialog from "#components/LoginDialog.svelte"; import LoginDialog from "#components/LoginDialog.svelte";
import { exclude } from "#lib/exclude";
export let gebaeude: GebaeudeClient = {} as GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient = {} as GebaeudeAufnahmeClient;
export let images: UploadedGebaeudeBild[] = [];
export let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
let gebaeude_aufnahme_allgemein = ausweis.gebaeude_aufnahme_allgemein || {};
let gebaeude = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten || {};
let images = ausweis.gebaeude_aufnahme_allgemein?.gebaeude_stammdaten?.gebaeude_bilder || [];
async function bilderHochladen() { async function bilderHochladen() {
if (images.length == 0) { if (images.length == 0) {
return; return;
} }
const imagesToUpload = images.filter(image => !image.uid);
if (imagesToUpload.length == 0) {
return;
}
// Alle Bilder hochladen // Alle Bilder hochladen
const notification = addNotification({ const notification = addNotification({
dismissable: false, dismissable: false,
message: "Bilder hochladen.", message: "Bilder hochladen.",
subtext: `${images.length} Bilder werden hochgeladen, bitte haben sie Geduld.`, subtext: `${imagesToUpload.length} Bilder werden hochgeladen, bitte haben sie Geduld.`,
timeout: 0, timeout: 0,
type: "info" type: "info"
}) })
for (let i = 0; i < images.length; i++) { for (let i = 0; i < imagesToUpload.length; i++) {
const image = images[i]; const image = imagesToUpload[i];
if (image.uid) {
// Bild wurde bereits hochgeladen, wir müssen es also nicht nochmal hochladen.
continue
}
try { try {
const response = await client.v1.bilder.upload.mutate({ const response = await client.v1.bilder.upload.mutate({
@@ -61,15 +65,15 @@
updateNotification(notification, { updateNotification(notification, {
dismissable: true, dismissable: true,
message: "Bild hochgeladen.", message: "Bild hochgeladen.",
subtext: `${i + 1}/${images.length} Bildern wurden erfolgreich hochgeladen, bitte haben sie Geduld.`, subtext: `${i + 1}/${imagesToUpload.length} Bildern wurden erfolgreich hochgeladen.`,
timeout: 4000 timeout: 3000
}) })
} catch (e) { } catch (e) {
updateNotification(notification, { updateNotification(notification, {
dismissable: true, dismissable: true,
message: "Bild konnte nicht hochgeladen werden.", message: "Bild konnte nicht hochgeladen werden.",
subtext: `Bild ${i + 1}/${images.length} konnte nicht hochgeladen werden, wir haben bereits ein Ticket erstellt und melden uns so schnell wie möglich bei ihnen.`, subtext: `Eines ihrer Bilder konnte nicht hochgeladen werden. Wir haben bereits ein Ticket erstellt und melden uns so schnell wie möglich bei ihnen.`,
timeout: 150000, timeout: 15000,
type: "error" type: "error"
}) })
} }
@@ -92,10 +96,17 @@
// Anscheinend wurde der Ausweis bereits erstellt und hat eine UID. // Anscheinend wurde der Ausweis bereits erstellt und hat eine UID.
// Jetzt müssen wir ihn nun nur noch abspeichern. // Jetzt müssen wir ihn nun nur noch abspeichern.
try { try {
const gebaeudeBilderEntfernt = exclude(gebaeude, ["gebaeude_bilder"])
const gebaeudeAufnahmeGeneratedFieldsEntfernt = exclude(gebaeude_aufnahme_allgemein, ["erstellungsdatum"])
const ausweisGeneratedFieldsEntfernt = exclude(ausweis, ["ausweisart", "rechnungen"])
await client.v1.verbrauchsausweisWohnen[2016].speichern.mutate({ await client.v1.verbrauchsausweisWohnen[2016].speichern.mutate({
ausweis, ...ausweisGeneratedFieldsEntfernt,
gebaeude, gebaeude_aufnahme_allgemein: {
gebaeude_aufnahme_allgemein ...gebaeudeAufnahmeGeneratedFieldsEntfernt,
gebaeude_stammdaten: {
...gebaeudeBilderEntfernt
}
}
}) })
await bilderHochladen(); await bilderHochladen();
@@ -108,9 +119,13 @@
// Wir speichern den Ausweis ab und leiten auf die "ausweis-gespeichert" Seite weiter. // Wir speichern den Ausweis ab und leiten auf die "ausweis-gespeichert" Seite weiter.
try { try {
const response = await client.v1.verbrauchsausweisWohnen[2016].erstellen.mutate({ const response = await client.v1.verbrauchsausweisWohnen[2016].erstellen.mutate({
ausweis, ...ausweis,
gebaeude, gebaeude_aufnahme_allgemein: {
gebaeude_aufnahme_allgemein ...gebaeude_aufnahme_allgemein,
gebaeude_stammdaten: {
...gebaeude
}
}
}) })
ausweis.uid = response.uid; ausweis.uid = response.uid;
gebaeude.uid = response.gebaeude_uid; gebaeude.uid = response.gebaeude_uid;

View File

@@ -1,60 +1,73 @@
<script lang="ts"> <script lang="ts">
import { BenutzerClient } from "#components/Ausweis/types"; import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte"; import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import DashboardAusweisSkeleton from "#components/Dashboard/DashboardAusweisSkeleton.svelte"; import DashboardAusweisSkeleton from "#components/Dashboard/DashboardAusweisSkeleton.svelte";
import { verbrauchsausweisWohnenCalculateFormProgress } from "#lib/VerbrauchsausweisWohnen/calculateFormProgress";
import { client } from "src/trpc"; import { client } from "src/trpc";
import { onMount } from "svelte";
export let user: BenutzerClient; export let user: BenutzerClient;
let ausweisRequest = client.v1.benutzer.getAusweise.query({ let ausweise: VerbrauchsausweisWohnenClient[] | null = null;
limit: 10
}); let ausweisUeberpruefung: ReturnType<typeof verbrauchsausweisWohnenCalculateFormProgress>[] = [];
let errorCount = 0;
onMount(async () => {
ausweise = await client.v1.verbrauchsausweisWohnen.getMany.query({
limit: 10
});
if (!ausweise) return;
ausweisUeberpruefung = ausweise.map(ausweis => verbrauchsausweisWohnenCalculateFormProgress(ausweis));
errorCount = ausweisUeberpruefung.reduce((acc, { errors }) => acc + errors.length, 0);
})
</script> </script>
{#if errorCount > 0}
<h1 class="text-4xl font-medium my-8">Wichtiges</h1> <h1 class="text-4xl font-medium my-8">Wichtiges</h1>
<div class="flex flex-row gap-4"> <div class="flex flex-row gap-4 overflow-x-auto">
<div class="card w-96 card-bordered bg-base-200 border-base-300"> {#each ausweisUeberpruefung as { errors }}
<div class="card-body"> {#if errors.length > 0}
<div class="badge badge-warning font-semibold">Warnung!</div> <div class="card w-96 card-bordered bg-base-200 border-base-300">
<h2 class="card-title">Gebäudebilder</h2> <div class="card-body">
<p>Wir haben festgestellt, dass die Bilder für eines ihrer Gebäude nicht ganz den Anforderungen entsprechen, beheben sie das Problem, damit der Fehler so schnell wie möglich behoben werden kann.</p> <div class="badge font-semibold" class:badge-warning={errors[0].severity == "warning"} class:badge-error={errors[0].severity == "error"}>{errors[0].severity == "error" ? "Achtung!" : "Wichtig!"}</div>
<div class="card-actions justify-end"> <h2 class="card-title">{errors[0].title}</h2>
<a class="btn btn-primary">Beheben</a> <p>{errors[0].description}</p>
{#if errors[0].resolvehref}
<div class="card-actions justify-end">
<a class="btn btn-primary" href={errors[0].resolvehref}>Beheben</a>
</div>
{/if}
</div>
</div> </div>
</div> {/if}
</div> {/each}
<div class="card w-96 card-bordered bg-base-200 border-base-300">
<div class="card-body">
<div class="badge badge-error font-semibold">Fehler!</div>
<h2 class="card-title">Daten</h2>
<p>Der Ausweis für <strong>Curslacker Deich 170</strong> hat unvollständige Daten oder die gegebenen Daten sind fehlerhaft, bitte beheben sie das Problem, damit der Ausweis so schnell wie möglich ausgestellt werden kann.</p>
<div class="card-actions justify-end">
<a class="btn btn-primary">Beheben</a>
</div>
</div>
</div>
</div> </div>
{/if}
<h1 class="text-4xl font-medium my-8">Ihre Ausweise</h1> <h1 class="text-4xl font-medium my-8">Ihre Ausweise</h1>
<div class="grid xl:grid-cols-2 grid-cols-1 gap-4"> <div class="grid xl:grid-cols-2 grid-cols-1 gap-4">
{#await ausweisRequest} {#if ausweise === null}
<DashboardAusweisSkeleton></DashboardAusweisSkeleton> <DashboardAusweisSkeleton></DashboardAusweisSkeleton>
<DashboardAusweisSkeleton></DashboardAusweisSkeleton> {:else}
{:then ausweise}
{#if ausweise.length == 0} {#if ausweise.length == 0}
<div class=""> <div class="">
<h1 class="text-2xl">Es konnten keine Ausweise gefunden werden.</h1> <h1 class="text-2xl">Es konnten keine Ausweise gefunden werden.</h1>
<p>Erstellen sie einen Verbrauchsausweis für ihr Wohngebäude <a href="/energieausweis-erstellen/verbrauchsausweis-wohnen">hier</a></p> <p>Erstellen sie einen Verbrauchsausweis für ihr Wohngebäude <a href="/energieausweis-erstellen/verbrauchsausweis-wohnen">hier</a></p>
</div> </div>
{:else} {:else}
{#each ausweise as ausweis} {#each ausweise as ausweis, i}
<DashboardAusweis {ausweis}></DashboardAusweis> <DashboardAusweis progress={ausweisUeberpruefung[i]?.progress || 0} {ausweis}></DashboardAusweis>
{/each} {/each}
{/if} {/if}
{/await} {/if}
</div> </div>

View File

@@ -2,10 +2,11 @@
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types"; import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte"; import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import DashboardAusweisSkeleton from "#components/Dashboard/DashboardAusweisSkeleton.svelte"; import DashboardAusweisSkeleton from "#components/Dashboard/DashboardAusweisSkeleton.svelte";
import { verbrauchsausweisWohnenCalculateFormProgress } from "#lib/VerbrauchsausweisWohnen/calculateFormProgress";
export let user: BenutzerClient; export let user: BenutzerClient;
export let ausweise: VerbrauchsausweisWohnenClient[]; export let ausweise: VerbrauchsausweisWohnenClient[];
console.log(ausweise); const ausweisUeberpruefung = ausweise.map(ausweis => verbrauchsausweisWohnenCalculateFormProgress(ausweis));
</script> </script>
@@ -41,8 +42,9 @@
{#if ausweise.length == 0} {#if ausweise.length == 0}
{:else} {:else}
{#each ausweise as ausweis} {#each ausweise as ausweis, i}
<DashboardAusweis {ausweis}></DashboardAusweis> {console.log(ausweis, i)}
<DashboardAusweis progress={ausweisUeberpruefung[i].progress} {ausweis}></DashboardAusweis>
{/each} {/each}
{/if} {/if}

View File

@@ -1,5 +1,4 @@
<script lang="ts"> <script lang="ts">
import HelpLabel from "#components/HelpLabel.svelte";
import ZipSearch from "../components/PlzSuche.svelte"; import ZipSearch from "../components/PlzSuche.svelte";
import Label from "../components/Label.svelte"; import Label from "../components/Label.svelte";
import type { import type {
@@ -15,12 +14,12 @@
import type { inferProcedureInput } from "@trpc/server"; import type { inferProcedureInput } from "@trpc/server";
import type { AppRouter } from "@ibcornelsen/api"; import type { AppRouter } from "@ibcornelsen/api";
import CheckoutItem from "#components/CheckoutItem.svelte"; import CheckoutItem from "#components/CheckoutItem.svelte";
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
export let user: Benutzer; export let user: BenutzerClient;
export let ausweis: export let ausweis:
| VerbrauchsausweisWohnen | VerbrauchsausweisWohnenClient;
| BedarfsausweisWohnen // TODO: überarbeiten und zu inferProcedureOutput machen
| VerbrauchsausweisGewerbe;
let rechnung: inferProcedureInput< let rechnung: inferProcedureInput<
AppRouter["v1"]["rechnungen"]["erstellen"] AppRouter["v1"]["rechnungen"]["erstellen"]
> = {}; > = {};
@@ -53,7 +52,7 @@
]; ];
export let selectedPaymentType: Bezahlmethoden = export let selectedPaymentType: Bezahlmethoden =
Enums.Bezahlmethoden.PAYPAL; Enums.Bezahlmethoden.paypal;
let agbAkzeptiert: boolean; let agbAkzeptiert: boolean;
let datenschutzAkzeptiert: boolean; let datenschutzAkzeptiert: boolean;

View File

@@ -1,19 +1,12 @@
<script lang="ts"> <script lang="ts">
import ProgressBar from "#components/Ausweis/Progressbar.svelte"; import ProgressBar from "#components/Ausweis/Progressbar.svelte";
import type { import type {
BedarfsausweisWohnen,
Benutzer,
Bezahlmethoden, Bezahlmethoden,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
} from "@ibcornelsen/database/client"; } from "@ibcornelsen/database/client";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
export let user: Benutzer; export let user: BenutzerClient;
export let ausweis: export let ausweis: VerbrauchsausweisWohnenClient;
| VerbrauchsausweisWohnen
| BedarfsausweisWohnen
| VerbrauchsausweisGewerbe;
let services = [ let services = [
{ {
@@ -46,6 +39,7 @@
Enums.Bezahlmethoden.paypal; Enums.Bezahlmethoden.paypal;
import { PRICES } from "#lib/constants"; import { PRICES } from "#lib/constants";
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
const prices = PRICES[ausweis.ausweisart]; const prices = PRICES[ausweis.ausweisart];

View File

@@ -2,69 +2,29 @@
import AusweisLayout from "#layouts/AusweisLayout.astro"; import AusweisLayout from "#layouts/AusweisLayout.astro";
import VerbrauchsausweisWohnenModule from "#modules/Ausweise/VerbrauchsausweisWohnenModule.svelte"; import VerbrauchsausweisWohnenModule from "#modules/Ausweise/VerbrauchsausweisWohnenModule.svelte";
import { prisma } from "@ibcornelsen/database/server"; import { UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, GebaeudeClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types";
import { exclude } from "#lib/exclude";
import { UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, GebaeudeClient, BenutzerClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller"; import { createCaller } from "#lib/caller";
import { API_UID_COOKIE_NAME } from "#lib/constants";
const uid = Astro.url.searchParams.get("uid"); const uid = Astro.url.searchParams.get("uid");
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient; let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
let gebaeude: GebaeudeClient = {} as GebaeudeClient;
let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient = {} as GebaeudeAufnahmeClient; const caller = createCaller(Astro);
let images: UploadedGebaeudeBild[] = [];
if (uid) { if (uid) {
const request = await prisma.verbrauchsausweisWohnen.findUnique({ ausweis = await caller.v1.verbrauchsausweisWohnen.get({
where: { uid }, uid: uid
include: {
gebaeude_aufnahme_allgemein: {
include: {
gebaeude_stammdaten: {
include: {
gebaeude_bilder: true
}
}
}
}
}
}) })
if (request) { if (!ausweis) {
images = (await Promise.all(request.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder.map(async bild => { // Der Ausweis scheint nicht zu existieren.
try { // Wir leiten auf die generische Ausweisseite ohne UID weiter.
const response = await createCaller(Astro).v1.bilder.getBase64({uid: bild.uid}); return Astro.redirect("/energieausweis-erstellen/verbrauchsausweis-wohnen");
return {
base64: `data:image/webp;charset=utf-8;base64, ${response.base64}`,
uid: bild.uid,
kategorie: bild.kategorie
}
} catch (error) {
return null
}
}))).filter(x => x !== null) as UploadedGebaeudeBild[];
let { gebaeude_aufnahme_allgemein: {
gebaeude_stammdaten: { gebaeude_bilder, ...request_gebaeude_stammdaten },
...request_gebaeude_aufnahme_allgemein
}, ...request_ausweis } = request;
ausweis = exclude(request_ausweis, ["id", "gebaeudeaufnahme_allgemein_id", "ausweisart", "benutzer_id", "rechnungen_id"]) satisfies VerbrauchsausweisWohnenClient;
gebaeude = exclude(request_gebaeude_stammdaten, ["id", "benutzer_id"]) satisfies GebaeudeClient;
gebaeude_aufnahme_allgemein = exclude(request_gebaeude_aufnahme_allgemein, ["id", "gebaeude_stammdaten_id"]) satisfies GebaeudeAufnahmeClient;
} }
} }
const benutzerUid = Astro.cookies.get(API_UID_COOKIE_NAME).value const user = await caller.v1.benutzer.self();
let user: BenutzerClient = {} as BenutzerClient;
if (benutzerUid) {
user = await createCaller(Astro).v1.benutzer.fromPublicId({
uid: benutzerUid
})
}
--- ---
<AusweisLayout title="Verbrauchsausweis erstellen"> <AusweisLayout title="Verbrauchsausweis erstellen">
<VerbrauchsausweisWohnenModule client:load images={images} ausweis={ausweis} gebaeude={gebaeude} /> <VerbrauchsausweisWohnenModule client:load ausweis={ausweis} />
</AusweisLayout> </AusweisLayout>

View File

@@ -4,6 +4,7 @@ import KaufabschlussModule from "#modules/KaufabschlussModule.svelte";
import AusweisLayout from "#layouts/AusweisLayout.astro"; import AusweisLayout from "#layouts/AusweisLayout.astro";
import { Benutzer, Enums } from "@ibcornelsen/database/client"; import { Benutzer, Enums } from "@ibcornelsen/database/client";
import { prisma } from "@ibcornelsen/database/server"; import { prisma } from "@ibcornelsen/database/server";
import { createCaller } from "#lib/caller";
// Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde. // Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde.
const uidAusweis = Astro.url.searchParams.get("uid"); const uidAusweis = Astro.url.searchParams.get("uid");
@@ -18,24 +19,20 @@ if (!uid) {
return Astro.redirect("/401"); return Astro.redirect("/401");
} }
const user = await prisma.benutzer.findUnique({ const caller = createCaller(Astro);
where: {
uid
},
}) as Benutzer;
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ const ausweis = await caller.v1.verbrauchsausweisWohnen.get({
where: { uid: uidAusweis
uid: uidAusweis, })
},
});
if (!ausweis) { const user = await caller.v1.benutzer.self();
if (!ausweis || !user) {
return Astro.redirect("/404"); return Astro.redirect("/404");
} }
--- ---
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen"> <AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
<KaufabschlussModule user={user} ausweis={ausweis} selectedPaymentType={Enums.Bezahlmethoden.PAYPAL} client:load></KaufabschlussModule> <KaufabschlussModule user={user} ausweis={ausweis} selectedPaymentType={Enums.Bezahlmethoden.paypal} client:load></KaufabschlussModule>
</AusweisLayout> </AusweisLayout>

View File

@@ -2,8 +2,8 @@
import KundendatenModule from "#modules/KundendatenModule.svelte"; import KundendatenModule from "#modules/KundendatenModule.svelte";
import AusweisLayout from "#layouts/AusweisLayout.astro"; import AusweisLayout from "#layouts/AusweisLayout.astro";
import { Benutzer, Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { prisma } from "@ibcornelsen/database/server"; import { createCaller } from "#lib/caller";
// Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde. // Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde.
const uidAusweis = Astro.url.searchParams.get("uid"); const uidAusweis = Astro.url.searchParams.get("uid");
@@ -18,24 +18,20 @@ if (!uid) {
return Astro.redirect("/401"); return Astro.redirect("/401");
} }
const user = await prisma.benutzer.findUnique({ const caller = createCaller(Astro);
where: {
uid
},
}) as Benutzer;
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ const ausweis = await caller.v1.verbrauchsausweisWohnen.get({
where: { uid: uidAusweis
uid: uidAusweis, })
},
});
if (!ausweis) { const user = await caller.v1.benutzer.self();
if (!ausweis || !user) {
return Astro.redirect("/404"); return Astro.redirect("/404");
} }
--- ---
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen"> <AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
<KundendatenModule user={user} ausweis={ausweis} selectedPaymentType={Enums.Bezahlmethoden.PAYPAL} client:load></KundendatenModule> <KundendatenModule user={user} ausweis={ausweis} selectedPaymentType={Enums.Bezahlmethoden.paypal} client:load></KundendatenModule>
</AusweisLayout> </AusweisLayout>

View File

@@ -1,22 +1,18 @@
--- ---
import {
GebaeudeStammdaten,
VerbrauchsausweisWohnen,
prisma,
} from "@ibcornelsen/database/server";
import { generate } from "@pdfme/generator"; import { generate } from "@pdfme/generator";
import VerbrauchsausweisWohnen2016Template from "../../data/templates/verbrauchsausweis-wohnen-2016.json"; import VerbrauchsausweisWohnen2016Template from "../../data/templates/verbrauchsausweis-wohnen-2016.json";
import { convertAusweisData } from "#lib/AusweisData"; import { convertAusweisData } from "#lib/AusweisData";
import { variable } from "#lib/pdf/plugins/variables"; import { variable } from "#lib/pdf/plugins/variables";
import { text, image } from "@pdfme/schemas" import { text, image } from "@pdfme/schemas"
import { createCaller } from "#lib/caller";
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
const base64 = Astro.url.searchParams.get("base64"); const base64 = Astro.url.searchParams.get("base64");
let ausweis: (Partial<VerbrauchsausweisWohnen> & { gebaeude_stammdaten: Partial<GebaeudeStammdaten> }) | null = null; let ausweis: VerbrauchsausweisWohnenClient | null = null;
if (base64) { if (base64) {
const buffer = Buffer.from(base64, "base64"); const buffer = Buffer.from(base64, "base64");
const json = buffer.toString("utf-8"); const json = buffer.toString("utf-8");
ausweis = JSON.parse(json); ausweis = JSON.parse(json) as VerbrauchsausweisWohnenClient;
} else { } else {
const uidAusweis = Astro.url.searchParams.get("ausweis_uid"); const uidAusweis = Astro.url.searchParams.get("ausweis_uid");
@@ -24,22 +20,11 @@ if (base64) {
return Astro.redirect("/404"); return Astro.redirect("/404");
} }
ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ const caller = createCaller(Astro);
where: {
uid: uidAusweis, ausweis = await caller.v1.verbrauchsausweisWohnen.get({
}, uid: uidAusweis
include: { })
gebaeude_aufnahme_allgemein: {
include: {
gebaeude_stammdaten: {
include: {
gebaeude_bilder: true
}
},
}
},
},
});
} }
if (!ausweis) { if (!ausweis) {

View File

@@ -1,26 +1,18 @@
--- ---
import {
GebaeudeStammdaten,
VerbrauchsausweisWohnen,
prisma,
} from "@ibcornelsen/database/server";
import { generate } from "@pdfme/generator"; import { generate } from "@pdfme/generator";
import VerbrauchsausweisWohnen2016Template from "../../data/templates/verbrauchsausweis-wohnen-2016.json"; import VerbrauchsausweisWohnen2016Template from "../../data/templates/verbrauchsausweis-wohnen-2016.json";
import { convertAusweisData } from "#lib/AusweisData"; import { convertAusweisData } from "#lib/AusweisData";
import { variable } from "#lib/pdf/plugins/variables"; import { variable } from "#lib/pdf/plugins/variables";
import { text, image } from "@pdfme/schemas" import { text, image } from "@pdfme/schemas"
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller";
const base64 = Astro.url.searchParams.get("base64"); const base64 = Astro.url.searchParams.get("base64");
let ausweis: let ausweis: VerbrauchsausweisWohnenClient | null = null;
| (Partial<VerbrauchsausweisWohnen> & {
gebaeude_stammdaten: Partial<GebaeudeStammdaten>;
})
| null = null;
if (base64) { if (base64) {
const buffer = Buffer.from(base64, "base64"); const buffer = Buffer.from(base64, "base64");
const json = buffer.toString("utf-8"); const json = buffer.toString("utf-8");
ausweis = JSON.parse(json); ausweis = JSON.parse(json) as VerbrauchsausweisWohnenClient;
} else { } else {
const uidAusweis = Astro.url.searchParams.get("ausweis_uid"); const uidAusweis = Astro.url.searchParams.get("ausweis_uid");
@@ -28,14 +20,11 @@ if (base64) {
return Astro.redirect("/404"); return Astro.redirect("/404");
} }
ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ const caller = createCaller(Astro);
where: {
uid: uidAusweis, ausweis = await caller.v1.verbrauchsausweisWohnen.get({
}, uid: uidAusweis
include: { })
gebaeude_stammdaten: true,
},
});
} }
if (!ausweis) { if (!ausweis) {