Bugfixes im Zuge der Datenbank Umstellung

This commit is contained in:
Moritz Utcke
2024-02-25 11:45:30 +07:00
parent b3aa49e0a9
commit 61c36f6b78
35 changed files with 425 additions and 1130 deletions

View File

@@ -8,10 +8,11 @@
VerbrauchsausweisGewerbe,
} from "@ibcornelsen/database/client";
import { Enums } from "@ibcornelsen/database/client"
import { GebaeudeClient, VerbrauchsausweisWohnenClient } from "./types";
import { GebaeudeAufnahmeClient, GebaeudeClient, VerbrauchsausweisWohnenClient } from "./types";
export let gebaeude: GebaeudeClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
</script>
@@ -46,6 +47,7 @@
name="baujahr_heizung"
type="number"
onlyUnique={true}
minChars={4}
onFocusIn={() => {
addNotification({
message: "Info",
@@ -63,7 +65,7 @@
className={auditHeizungGebaeudeBaujahr(gebaeude)
? "linked"
: ""}
bind:tags={gebaeude.baujahr_heizung}
bind:tags={gebaeude_aufnahme_allgemein.baujahr_heizung}
/>
</div>
</div>
@@ -81,6 +83,7 @@
name="baujahr_gebaeude"
type="number"
onlyUnique={true}
minChars={4}
onFocusIn={() => {
addNotification({
message: "Info",
@@ -98,7 +101,7 @@
className={auditHeizungGebaeudeBaujahr(gebaeude)
? "linked"
: ""}
bind:tags={gebaeude.baujahr_gebaeude}
bind:tags={gebaeude_aufnahme_allgemein.baujahr_gebaeude}
/>
</div>
</div>
@@ -116,7 +119,7 @@
required
autocomplete="off"
data-msg="Pflichtfeld"
bind:value={gebaeude.einheiten}
bind:value={gebaeude_aufnahme_allgemein.einheiten}
maxlength="3"
/>
</div>
@@ -134,7 +137,7 @@
name="saniert"
class=""
required
bind:value={gebaeude.saniert}
bind:value={gebaeude_aufnahme_allgemein.saniert}
>
<option disabled>Bitte auswählen</option>
<option value={true}>saniert</option>

View File

@@ -10,12 +10,14 @@
VerbrauchsausweisGewerbe,
} from "@ibcornelsen/database/client";
import {
GebaeudeAufnahmeClient,
GebaeudeClient,
UploadedGebaeudeBild,
VerbrauchsausweisWohnenClient,
} from "./types";
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbe
@@ -40,7 +42,7 @@
type="checkbox"
class="checkbox"
name="zentralheizung"
bind:checked={gebaeude.zentralheizung}
bind:checked={gebaeude_aufnahme_allgemein.zentralheizung}
value="ZH"
/>Zentral/Etage</label
>
@@ -51,7 +53,7 @@
type="checkbox"
class="checkbox"
name="einzelofen"
bind:checked={gebaeude.einzelofen}
bind:checked={gebaeude_aufnahme_allgemein.einzelofen}
value="EO"
/>Einzelöfen</label
>
@@ -62,7 +64,7 @@
type="checkbox"
class="checkbox"
name="durchlauf_erhitzer"
bind:checked={gebaeude.durchlauf_erhitzer}
bind:checked={gebaeude_aufnahme_allgemein.durchlauf_erhitzer}
value="DH"
/>Durchlauferhitzer</label
>
@@ -73,7 +75,7 @@
type="checkbox"
class="checkbox"
name="standard_kessel"
bind:checked={gebaeude.standard_kessel}
bind:checked={gebaeude_aufnahme_allgemein.standard_kessel}
value="SK"
/>Standardkessel</label
>
@@ -84,7 +86,7 @@
type="checkbox"
class="checkbox"
name="solarsystem_warmwasser"
bind:checked={gebaeude.solarsystem_warmwasser}
bind:checked={gebaeude_aufnahme_allgemein.solarsystem_warmwasser}
value="SSWW"
/>Solarsystem für Warmwasser</label
>
@@ -95,7 +97,7 @@
type="checkbox"
class="checkbox"
name="waermepumpe"
bind:checked={gebaeude.waermepumpe}
bind:checked={gebaeude_aufnahme_allgemein.waermepumpe}
value="WP"
/>Wärmepumpe</label
>
@@ -106,7 +108,7 @@
type="checkbox"
class="checkbox"
name="niedertemperatur_kessel"
bind:checked={gebaeude.niedertemperatur_kessel}
bind:checked={gebaeude_aufnahme_allgemein.niedertemperatur_kessel}
value="NK"
/>Niedertemperaturkessel</label
>
@@ -117,7 +119,7 @@
type="checkbox"
class="checkbox"
name="brennwert_kessel"
bind:checked={gebaeude.brennwert_kessel}
bind:checked={gebaeude_aufnahme_allgemein.brennwert_kessel}
value="BWK"
/>Brennwertkessel</label
>
@@ -128,7 +130,7 @@
type="checkbox"
class="checkbox"
name="warmwasser_rohre_gedaemmt"
bind:checked={gebaeude.warmwasser_rohre_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.warmwasser_rohre_gedaemmt}
value="WRGD"
/>Warmwasserrohre gedämmt</label
>
@@ -139,7 +141,7 @@
type="checkbox"
class="checkbox"
name="heizungsrohre_gedaemmt"
bind:checked={gebaeude.heizungsrohre_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.heizungsrohre_gedaemmt}
value="HRGD"
/>Heizungsrohre gedämmt</label
>
@@ -150,7 +152,7 @@
type="checkbox"
class="checkbox"
name="zirkulation"
bind:checked={gebaeude.zirkulation}
bind:checked={gebaeude_aufnahme_allgemein.zirkulation}
value="ZK"
/>Zirkulation</label
>
@@ -161,7 +163,7 @@
type="checkbox"
class="checkbox"
name="raum_temperatur_regler"
bind:checked={gebaeude.raum_temperatur_regler}
bind:checked={gebaeude_aufnahme_allgemein.raum_temperatur_regler}
value="RTR"
/>Raumtemperaturregler</label
>
@@ -191,7 +193,7 @@
type="checkbox"
class="checkbox"
name="einfach_verglasung"
bind:checked={gebaeude.einfach_verglasung}
bind:checked={gebaeude_aufnahme_allgemein.einfach_verglasung}
value="EG"
/>Einfachglas</label
>
@@ -202,7 +204,7 @@
type="checkbox"
class="checkbox"
name="doppel_verglasung"
bind:checked={gebaeude.doppel_verglasung}
bind:checked={gebaeude_aufnahme_allgemein.doppel_verglasung}
value="DF"
/>Doppelverglasung</label
>
@@ -213,7 +215,7 @@
type="checkbox"
class="checkbox"
name="isolier_verglasung"
bind:checked={gebaeude.isolier_verglasung}
bind:checked={gebaeude_aufnahme_allgemein.isolier_verglasung}
value="IVG"
/>Isolierverglasung</label
>
@@ -224,7 +226,7 @@
type="checkbox"
class="checkbox"
name="dreifach_verglasung"
bind:checked={gebaeude.dreifach_verglasung}
bind:checked={gebaeude_aufnahme_allgemein.dreifach_verglasung}
value="PHF"
/>Dreifachverglasung</label
>
@@ -235,7 +237,7 @@
type="checkbox"
class="checkbox"
name="fenster_dicht"
bind:checked={gebaeude.fenster_dicht}
bind:checked={gebaeude_aufnahme_allgemein.fenster_dicht}
value="FD"
/>Alle Fenster dicht</label
>
@@ -246,7 +248,7 @@
type="checkbox"
class="checkbox"
name="fenster_teilweise_undicht"
bind:checked={gebaeude.fenster_teilweise_undicht}
bind:checked={gebaeude_aufnahme_allgemein.fenster_teilweise_undicht}
value="FTUD"
/>Fenster teilweise undicht</label
>
@@ -257,7 +259,7 @@
type="checkbox"
class="checkbox"
name="tueren_dicht"
bind:checked={gebaeude.tueren_dicht}
bind:checked={gebaeude_aufnahme_allgemein.tueren_dicht}
value="TD"
/>Alle Türen dicht</label
>
@@ -268,7 +270,7 @@
type="checkbox"
class="checkbox"
name="tueren_undicht"
bind:checked={gebaeude.tueren_undicht}
bind:checked={gebaeude_aufnahme_allgemein.tueren_undicht}
value="TUD"
/>Türen teilweise undicht</label
>
@@ -279,7 +281,7 @@
type="checkbox"
class="checkbox"
name="rolllaeden_kaesten_gedaemmt"
bind:checked={gebaeude.rolllaeden_kaesten_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.rolllaeden_kaesten_gedaemmt}
value="RKD"
/>Rollladenkästen gedämmt, luftdicht</label
>
@@ -312,7 +314,7 @@
type="checkbox"
class="checkbox"
name="aussenwand_gedaemmt"
bind:checked={gebaeude.aussenwand_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.aussenwand_gedaemmt}
value="AWD"
/>Außenwand gedämmt</label
>
@@ -323,7 +325,7 @@
type="checkbox"
class="checkbox"
name="keller_wand_gedaemmt"
bind:checked={gebaeude.keller_wand_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.keller_wand_gedaemmt}
value="KWD"
/>Kelleraußenwand gedämmt</label
>
@@ -334,7 +336,7 @@
type="checkbox"
class="checkbox"
name="keller_decke_gedaemmt"
bind:checked={gebaeude.keller_decke_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.keller_decke_gedaemmt}
value="KDD"
/>Kellerdecke gedämmt</label
>
@@ -345,7 +347,7 @@
type="checkbox"
class="checkbox"
name="dachgeschoss_gedaemmt"
bind:checked={gebaeude.dachgeschoss_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.dachgeschoss_gedaemmt}
value="DGD"
/>Dachgeschoss gedämmt</label
>
@@ -356,7 +358,7 @@
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_gedaemmt"
bind:checked={gebaeude.oberste_geschossdecke_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.oberste_geschossdecke_gedaemmt}
value="OGDDW"
/>Oberste Geschossdecke gedämmt</label
>
@@ -367,7 +369,7 @@
type="checkbox"
class="checkbox"
name="oberste_geschossdecke_min_12cm_gedaemmt"
bind:checked={gebaeude.oberste_geschossdecke_min_12cm_gedaemmt}
bind:checked={gebaeude_aufnahme_allgemein.oberste_geschossdecke_min_12cm_gedaemmt}
value="OGDD"
/>Oberste Geschossdecke min. 12cm gedämmt</label
>

View File

@@ -1,10 +1,11 @@
<script lang="ts">
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte";
import { BedarfsausweisWohnenClient, GebaeudeClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types";
import { BedarfsausweisWohnenClient, GebaeudeAufnahmeClient, GebaeudeClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let gebaeude: GebaeudeClient;
let maxPerformance = 250;
@@ -42,7 +43,7 @@
let translation_2 = 0;
$: {
(async () => {
const result = (await endEnergieVerbrauchVerbrauchsausweis_2016({ ...ausweis, gebaeude_stammdaten: gebaeude}));
const result = (await endEnergieVerbrauchVerbrauchsausweis_2016({ ...ausweis, gebaeude_stammdaten: gebaeude, gebaeude_aufnahme_allgemein}));
if (!result) {
return

View File

@@ -5,7 +5,7 @@
import fuelList from "./brennstoffListe";
import { auditVerbrauchAbweichung } from "../Verbrauchsausweis/audits/VerbrauchAbweichung";
import type { VerbrauchsausweisGewerbe } from "@ibcornelsen/database/client";
import { GebaeudeClient, VerbrauchsausweisWohnenClient } from "./types";
import { GebaeudeAufnahmeClient, GebaeudeClient, VerbrauchsausweisWohnenClient } from "./types";
let availableYears = [
2018, 2019,
@@ -26,6 +26,7 @@
];
export let gebaeude: GebaeudeClient;
export let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe;
const fuelMap: Record<string, string[]> = {};
@@ -92,7 +93,7 @@
<b>Koks:</b> Stark kohlenstoffhaltiger Brennstoff.<br /><br />
</HelpLabel>
<div>
<select name="brennstoff_1" required bind:value={ausweis.brennstoff_1}>
<select name="brennstoff_1" required bind:value={gebaeude_aufnahme_allgemein.brennstoff_1}>
<option disabled>Bitte auswählen</option>
{#each Object.keys(fuelMap) as fuel}
<option value={fuel}>{fuel}</option>
@@ -114,7 +115,7 @@
bind:value={ausweis.einheit_1}
>
<option disabled>Bitte auswählen</option>
{#each (fuelMap.hasOwnProperty(ausweis.brennstoff_1) ? fuelMap[ausweis.brennstoff_1] : []) as unit}
{#each (fuelMap.hasOwnProperty(gebaeude_aufnahme_allgemein.brennstoff_1) ? fuelMap[gebaeude_aufnahme_allgemein.brennstoff_1] : []) as unit}
<option value={unit}>{unit}</option>
{/each}
</select>
@@ -126,7 +127,7 @@
<div>
<select
name="brennstoff_2"
bind:value={ausweis.brennstoff_2}
bind:value={gebaeude_aufnahme_allgemein.brennstoff_2}
disabled={!ausweis.zusaetzliche_heizquelle}
required
>
@@ -148,7 +149,7 @@
required
>
<option disabled>Bitte auswählen</option>
{#each (fuelMap.hasOwnProperty(ausweis.brennstoff_2) ? fuelMap[ausweis.brennstoff_2] : []) as unit}
{#each (fuelMap.hasOwnProperty(gebaeude_aufnahme_allgemein.brennstoff_2) ? fuelMap[gebaeude_aufnahme_allgemein.brennstoff_2] : []) as unit}
<option value={unit}>{unit}</option>
{/each}
</select>

View File

@@ -67,4 +67,8 @@ export type GebaeudeClient = inferProcedureInput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["2016"]["speichern"]
>["gebaeude"];
export type GebaeudeAufnahmeClient = inferProcedureInput<
AppRouter["v1"]["verbrauchsausweisWohnen"]["2016"]["speichern"]
>["gebaeude_aufnahme_allgemein"];
export type BenutzerClient = inferProcedureOutput<AppRouter["v1"]["benutzer"]["fromPublicId"]>

View File

@@ -1,18 +1,22 @@
<script lang="ts">
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import {
BenutzerClient,
GebaeudeClient,
VerbrauchsausweisWohnenClient,
} from "./Ausweis/types.js";
export let ausweis: VerbrauchsausweisWohnenClient & {
gebaeude_stammdaten: GebaeudeClient;
gebaeude_aufnahme_allgemein: GebaeudeClient & {
gebaeude_stammdaten: GebaeudeClient;
};
benutzer: BenutzerClient;
};
export let calculations: Awaited<
ReturnType<typeof endEnergieVerbrauchVerbrauchsausweis_2016>
>;
console.log(ausweis);
console.log(calculations);
const ausweisArt = "VA"; // TODO: Das ist ein Platzhalter, hier muss die Ausweisart aus dem Ausweisobjekt kommen
@@ -256,7 +260,7 @@
}
let tooltip1Z1 =
ausweis.gebaeude_stammdaten.adresse +
ausweis.gebaeude_aufnahme_allgemein.adresse +
", " +
ausweis.objekt_plz +
" " +

View File

@@ -1,5 +1,6 @@
<script lang="ts">
import {
GebaeudeAufnahmeClient,
GebaeudeClient,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types";
@@ -12,9 +13,15 @@
Pencil2,
QuestionMarkCircled,
} from "radix-svelte-icons";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
import { GebaeudeBilder } from "@ibcornelsen/database/client";
export let ausweis: VerbrauchsausweisWohnenClient & {
gebaeude_stammdaten: GebaeudeClient;
gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient & {
gebaeude_stammdaten: GebaeudeClient & {
gebaeude_bilder: GebaeudeBilder[];
};
};
};
async function ausweisStornieren() {
@@ -39,11 +46,14 @@
</script>
<div class="card lg:card-side bg-base-200 card-bordered border-base-300">
<div class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-10 rounded-lg select-none">
<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>
<figure class="lg:w-1/2">
<img
src="https://www.houseanddecors.com/wp-content/uploads/2019/01/modern-house-04.jpg"
src={(ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder && ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.gebaeude_bilder[0]?.url) || "/images/placeholder.jpg"}
class="object-cover w-full h-full"
alt="Album"
alt="Gebäudebild"
/>
</figure>
<div class="card-body lg:w-1/2">
@@ -76,19 +86,23 @@
</div>
<div class="badge badge-success font-semibold">Ausgestellt</div>
</div>
<h2 class="card-title">{ausweis.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">
<progress class="progress w-full" value="54" max="100"></progress>
<!-- TODO: Metrics für den Fortschritt festlegen -->
<span class="text-sm font-semibold text-base-content">54%</span>
</div>
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis)}
{:then calculations}
<div class="flex flex-col gap-2">
<div class="flex flex-row justify-between">
<span>Energieverbrauch</span>
<span class="font-bold text-base-content">215kWh/A</span>
<span class="font-bold text-base-content">{calculations?.endEnergieVerbrauchGesamt}kWh/A</span>
</div>
<div class="flex flex-row justify-between">
<span>CO2 Ausstoß</span>
<span class="font-bold text-base-content">N/A</span>
<span class="font-bold text-base-content">{calculations?.co2EmissionenGesamt}Kg/A</span>
</div>
<div class="flex flex-row justify-between">
<span>Erstellungsdatum</span>
@@ -103,20 +117,21 @@
<span
class="font-bold text-base-content"
title="Gebäude / Heizung"
>{ausweis.gebaeude_stammdaten.baujahr_gebaeude[0] || "N/A"} /
{ausweis.gebaeude_stammdaten.baujahr_heizung[0] ||
>{ausweis.gebaeude_aufnahme_allgemein.baujahr_gebaeude[0] || "N/A"} /
{ausweis.gebaeude_aufnahme_allgemein.baujahr_heizung[0] ||
"N/A"}</span
>
</div>
<div class="flex flex-row justify-between">
<span>Wohnfläche</span>
<span class="font-bold text-base-content"
>{ausweis.gebaeude_stammdaten.flaeche
? `${ausweis.gebaeude_stammdaten.flaeche}m²`
>{ausweis.gebaeude_aufnahme_allgemein.flaeche
? `${ausweis.gebaeude_aufnahme_allgemein.flaeche}m²`
: "N/A"}</span
>
</div>
</div>
{/await}
<div class="card-actions justify-end mt-8">
<a class="btn btn-primary">Bearbeiten</a>
<button class="btn btn-ghost" title="PDF Herunterladen">

View File

@@ -28,7 +28,7 @@
</script>
<aside class="hidden md:flex bg-base-100 border-r border-r-base-300 flex-col py-8">
<a href="/dashboard" class="px-8"
<a href="/" class="px-8"
><img
src="/images/header/logo-big.svg"
class="w-36"
@@ -37,10 +37,10 @@
>
<div class="menu flex flex-col gap-2 mt-12 px-0">
<button use:ripple={rippleOptions} class="button-tab">
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard">
<Home width={22} height={22} />
Home
</button>
</a>
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/ausweise">
<Reader width={22} height={22} />
Ausweise

View File

@@ -1,9 +0,0 @@
<script>
import moment from "moment";
</script>
<div class="flex flex-row items-end justify-between px-12 py-8 border-t-8 border-t-primary">
<h2>Copyright © {moment().format("YYYY")} • IB Cornelsen</h2>
<h2>info@online-energieausweis.org</h2>
</div>

View File

@@ -1,8 +0,0 @@
<div class="flex flex-row items-end justify-between px-12 py-8 border-b-8 border-b-primary">
<img src="/images/header/logo-big.png" width="250px" height="auto" alt="">
<div class="flex flex-col">
<p>fon 040 · 209339850</p>
<p>fax 040 · 209339859</p>
<p>online-energieausweis.org</p>
</div>
</div>

View File

@@ -1,5 +1,4 @@
---
import { Moon, Sun } from "radix-svelte-icons";
import { validateAccessTokenServer } from "src/server/lib/validateAccessToken";
import ThemeController from "./ThemeController.svelte";
@@ -63,6 +62,6 @@ const lightTheme = Astro.cookies.get("theme").value === "light";
<style>
.header-button {
@apply px-4 py-2 text-primary-content font-medium text-lg tracking-normal hover:bg-secondary;
@apply px-4 py-2 text-primary-content font-medium text-lg tracking-normal hover:bg-secondary h-full;
}
</style>

View File

@@ -1,93 +0,0 @@
<script lang="ts">
import ProgressBar from "#components/Ausweis/Progressbar.svelte";
import PriceContainer from "#components/Kaufabschluss/PriceContainer.svelte";
import KundendatenContainer from "#components/Kaufabschluss/KundendatenContainer.svelte";
const prices = [45, 60, 160];
</script>
<div class="gap-8 items-center mb-8 grid grid-cols-2">
<div>
<h1>Verbrauchsausweis erstellen - 45€</h1>
<ProgressBar progress={100} />
</div>
<div />
</div>
<form action="FORM/transfer/VA_3to4" method="POST" novalidate>
<fieldset>
<div class="grid grid-cols-2 gap-6">
<PriceContainer {prices} />
<KundendatenContainer />
<div class="yellow-box">
<h4>Bitte wählen sie ihre Bezahlmethode aus.</h4>
<div class="flex flex-row gap-4">
<div>
<div class="payment-option-card">
<img src="/images/paypal.png" alt="PayPal" />
<div
class="payment-option-label"
aria-label="Zahlen mit PayPal"
>
Zahlen mit PayPal
</div>
</div>
<div class="payment-option-card">
<img src="/images/giropay.png" alt="Giropay" />
<div
class="payment-option-label"
aria-label="Zahlen mit Giropay"
>
Zahlen mit Giropay
</div>
</div>
<div class="payment-option-card">
<img src="/images/sofort.png" alt="Sofort" />
<div
class="payment-option-label"
aria-label="Zahlen mit Sofort"
>
Zahlen mit Sofort
</div>
</div>
</div>
<div>
<div class="payment-option-card">
<img
src="/images/mastercard.png"
alt="Mastercard"
/>
<div
class="payment-option-label"
aria-label="Zahlen mit Kreditkarte"
>
Zahlen mit Kreditkarte
</div>
</div>
<div class="payment-option-card">
<img src="/images/rechnung.png" alt="Rechnung" />
<div
class="payment-option-label"
aria-label="Zahlen mit Rechnung"
>
Zahlen mit Rechnung
</div>
</div>
<div class="payment-option-card">
<img src="/images/sepa.png" alt="SEPA" />
<div
class="payment-option-label"
aria-label="Zahlen mit SEPA über PayPal"
>
SEPA über PayPal
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
<button class="button">Daten ändern</button>
</form>

View File

@@ -1,71 +0,0 @@
<script lang="ts">
import Label from "../Label.svelte";
</script>
<div class="yellow-box flex flex-col gap-2">
<div>
<Label>Kunde</Label>
<input type="text" readonly />
</div>
<div>
<Label>Telefon</Label>
<input type="text" readonly />
</div>
<div>
<Label>E-Mail</Label>
<input type="text" readonly />
</div>
<hr />
<div>
<Label>Rechnungsempfänger</Label>
<input type="text" readonly />
</div>
<div>
<Label>Zusatzzeile</Label>
<input type="text" readonly />
</div>
<div>
<Label>Strasse</Label>
<input type="text" readonly />
</div>
<div>
<Label>Telefon</Label>
<input type="text" readonly />
</div>
<div>
<Label>E-Mail</Label>
<input type="text" readonly />
</div>
<div>
<Label>PLZ und Ort</Label>
<input type="text" readonly />
</div>
<hr />
<div>
<Label>Versandempfänger</Label>
<input type="text" readonly />
</div>
<div>
<Label>Zusatzzeile</Label>
<input type="text" readonly />
</div>
<div>
<Label>Strasse</Label>
<input type="text" readonly />
</div>
<div>
<Label>PLZ und Ort</Label>
<input type="text" readonly />
</div>
</div>

View File

@@ -1,10 +0,0 @@
<div class="rounded-lg border-4 border-pdf-yellow-bright p-2">
<div class="flex flex-row gap-2 items-end">
<h1 class="text-4xl font-bold">ENERGIEAUSWEIS</h1>
<span class="text-lg font-semibold">für Wohngebäude</span>
</div>
<p>
gemäß den §§ 16 ff. Energieeinsparverordnung (EnEV) vom ¹ <span
class="bg-gray-300 p-0.5">18. November 2013</span>
</p>
</div>

View File

@@ -1,15 +0,0 @@
<script lang="ts">
export let number: number;
</script>
<div class="flex flex-row gap-2">
<div
class="bg-pdf-yellow-light rounded-lg w-full h-10 items-center justify-between flex flex-row px-2"
>
<slot></slot>
</div>
<span
class="w-10 h-10 rounded-full border-pdf-yellow-bright border-4 bg-pdf-yellow-light flex items-center justify-center font-bold text-xl"
>{number}</span
>
</div>

View File

@@ -25,7 +25,7 @@
return;
}
if (minChars > tag.length) {
if (minChars > tag.toString().length) {
return;
}
@@ -74,6 +74,12 @@
on:keydown={onKeydown}
on:focusin={onFocusIn}
on:focusout={onFocusOut}
on:blur={() => {
if (tag.toString().length >= minChars) {
addTag(tag)
tag = ""
}
}}
class="input input-bordered h-10 px-2 py-1.5 {className}"
disabled={disable}
readonly={readonly}

View File

@@ -1,25 +0,0 @@
---
import Settings from "#components/Icons/Settings.svelte";
import Home from "./Icons/Home.svelte";
---
<div class="bg-violet-50 flex flex-col items-center justify-between py-8">
<div>
<a href="/">
<Home width={25} height={25}></Home>
</a>
</div>
<a href="/user/settings">
<Settings width={25} height={25}></Settings>
</a>
</div>
<style>
a {
@apply p-1 rounded-lg transition-colors block;
}
a:hover {
@apply bg-violet-100;
}
</style>

View File

File diff suppressed because one or more lines are too long

View File

@@ -1,33 +0,0 @@
---
export interface Props {
title: string;
}
const { title } = Astro.props;
---
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>
{title || 'Energieausweis online erstellen - Online Energieausweis'}
</title>
</head>
<body class="w-[210mm] h-[297mm] py-[12mm] px-[16mm]">
<main>
<article class="mainContent">
<slot />
</article>
</main>
</body>
</html>
<style is:global>
* {
font-family: Arial, Helvetica, sans-serif;
}
</style>

23
src/lib/AusweisData.ts Normal file
View File

@@ -0,0 +1,23 @@
import { VerbrauchsausweisWohnen, Benutzer, GebaeudeStammdaten, Rechnungen } from "@ibcornelsen/database/client";
export type AusweisData = VerbrauchsausweisWohnen & {
benutzer: Benutzer;
gebaeude_stammdaten: GebaeudeStammdaten;
rechnungen: Rechnungen;
};
export function convertAusweisData(
inputs: AusweisData
): Record<string, string> {
return {
"gebaeude_stammdaten.adresse": inputs.gebaeude_stammdaten.adresse || "",
"gebaeude_stammdaten.gebaeudetyp":
inputs.gebaeude_stammdaten.gebaeudetyp || "",
"gebaeude_stammdaten.baujahr_gebaeude":
inputs.gebaeude_stammdaten.baujahr_gebaeude.join(", ") || "",
"gebaeude_stammdaten.baujahr_heizung":
inputs.gebaeude_stammdaten.baujahr_heizung.join(", ") || "",
"gebaeude_stammdaten.plz": inputs.gebaeude_stammdaten.plz || "",
"gebaeude_stammdaten.ort": inputs.gebaeude_stammdaten.ort || "",
};
}

View File

@@ -1,55 +1,59 @@
import { VerbrauchsausweisWohnenClient, GebaeudeClient } from "#components/Ausweis/types";
import { VerbrauchsausweisWohnenClient, GebaeudeClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types";
import { getKlimafaktoren } from "#lib/Klimafaktoren";
import { getHeizwertfaktor } from "#lib/server/Heizwertfaktor";
import moment from "moment";
export function energetischeNutzflaecheVerbrauchsausweisWohnen_2016(
ausweis: VerbrauchsausweisWohnenClient & {
gebaeude_stammdaten: GebaeudeClient;
gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient & {
gebaeude_stammdaten: GebaeudeClient;
};
}
): number {
if (!ausweis.gebaeude_stammdaten) {
if (!ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten) {
return 0
}
let faktorKeller = 1.2;
if (ausweis.keller_beheizt && (ausweis.gebaeude_stammdaten.einheiten || 1) <= 2) {
if (ausweis.keller_beheizt && (ausweis.gebaeude_aufnahme_allgemein.einheiten || 1) <= 2) {
faktorKeller = 1.35;
}
if ((ausweis.gebaeude_stammdaten.nutzflaeche || 0) > 0) {
return ausweis.gebaeude_stammdaten.nutzflaeche || 0;
if ((ausweis.gebaeude_aufnahme_allgemein.nutzflaeche || 0) > 0) {
return ausweis.gebaeude_aufnahme_allgemein.nutzflaeche || 0;
} else {
return (ausweis.gebaeude_stammdaten.flaeche || 1) * faktorKeller;
return (ausweis.gebaeude_aufnahme_allgemein.flaeche || 1) * faktorKeller;
}
}
export async function endEnergieVerbrauchVerbrauchsausweis_2016(
ausweis: VerbrauchsausweisWohnenClient & {
gebaeude_stammdaten: GebaeudeClient;
gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient & {
gebaeude_stammdaten: GebaeudeClient;
}
}
) {
if (!ausweis.gebaeude_stammdaten.plz || !ausweis.startdatum) {
return null
}
let startdatum = moment(ausweis.startdatum);
let klimafaktoren: Awaited<ReturnType<typeof getKlimafaktoren>> = [{
month: ausweis.startdatum.getMonth(),
year: ausweis.startdatum.getFullYear(),
month: startdatum.month(),
year: startdatum.year(),
klimafaktor: 1
},
{
month: ausweis.startdatum.getMonth(),
year: ausweis.startdatum.getFullYear() + 1,
month: startdatum.month(),
year: startdatum.year() + 1,
klimafaktor: 1
},
{
month: ausweis.startdatum.getMonth(),
year: ausweis.startdatum.getFullYear() + 2,
month: startdatum.month(),
year: startdatum.year() + 2,
klimafaktor: 1
}];
try {
const response = await getKlimafaktoren(ausweis.startdatum, ausweis.gebaeude_stammdaten.plz)
const response = await getKlimafaktoren(ausweis.startdatum, ausweis.gebaeude_aufnahme_allgemein.gebaeude_stammdaten.plz)
if (response) {
klimafaktoren = response
@@ -64,11 +68,11 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
// Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = getHeizwertfaktor(
ausweis.brennstoff_1 as string,
ausweis.gebaeude_aufnahme_allgemein.brennstoff_1 as string,
ausweis.einheit_1 as string
);
let brennstoff_2 = getHeizwertfaktor(
ausweis.brennstoff_2 as string,
ausweis.gebaeude_aufnahme_allgemein.brennstoff_2 as string,
ausweis.einheit_2 as string
);
@@ -90,10 +94,10 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
let energieVerbrauchWarmwasser_2 = 0;
let leerstandsZuschlagWarmwasser = 0;
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
let leerstand = (ausweis.gebaeude_stammdaten.leerstand || 0) / 100;
let leerstand = (ausweis.gebaeude_aufnahme_allgemein.leerstand || 0) / 100;
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
if (ausweis.gebaeude_stammdaten.solarsystem_warmwasser) {
if (ausweis.gebaeude_aufnahme_allgemein.solarsystem_warmwasser) {
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
energieVerbrauchWarmwasser_1 =
energieVerbrauchGesamt_1 *
@@ -116,7 +120,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
leerstand *
(energieVerbrauchWarmwasser_1 + energieVerbrauchWarmwasser_2);
} else {
if (ausweis.gebaeude_stammdaten.solarsystem_warmwasser) {
if (ausweis.gebaeude_aufnahme_allgemein.solarsystem_warmwasser) {
// Wenn Warmwasser Anteil unbekannt und Solarsystem
energieVerbrauchWarmwasser_1 = energetischeNutzflaeche * 12 * 3;
energieVerbrauchWarmwasser_2 = 0;
@@ -184,7 +188,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
let primaerfaktorww = 0;
let primaerfaktorww_1 = 0;
if (!ausweis.warmwasser_enthalten && ausweis.gebaeude_stammdaten.durchlauf_erhitzer) {
if (!ausweis.warmwasser_enthalten && ausweis.gebaeude_aufnahme_allgemein.durchlauf_erhitzer) {
primaerfaktorww = 1.8;
primaerfaktorww_1 = 1.8;
} else {

View File

@@ -19,11 +19,12 @@
import Overlay from "#components/Overlay.svelte";
import AusweisGespeichertModule from "./AusweisGespeichertModule.svelte";
import { validateAccessTokenClient } from "src/client/lib/validateAccessToken";
import { UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, GebaeudeClient, BenutzerClient } from "#components/Ausweis/types";
import { UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, GebaeudeClient, BenutzerClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types";
import { dialogs } from "svelte-dialogs";
import LoginDialog from "#components/LoginDialog.svelte";
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 user: BenutzerClient = {} as BenutzerClient;
@@ -93,7 +94,8 @@
try {
await client.v1.verbrauchsausweisWohnen[2016].speichern.mutate({
ausweis,
gebaeude
gebaeude,
gebaeude_aufnahme_allgemein
})
await bilderHochladen();
@@ -107,10 +109,12 @@
try {
const response = await client.v1.verbrauchsausweisWohnen[2016].erstellen.mutate({
ausweis,
gebaeude
gebaeude,
gebaeude_aufnahme_allgemein
})
ausweis.uid = response.uid;
gebaeude.uid = response.gebaeude_uid;
gebaeude_aufnahme_allgemein.uid = response.gebaeude_aufnahme_uid
await bilderHochladen();
@@ -149,25 +153,25 @@
}
function automatischAusfüllen() {
gebaeude.baujahr_gebaeude = [1962];
gebaeude.baujahr_heizung = [1952];
gebaeude.saniert = true;
gebaeude.einheiten = 1;
gebaeude_aufnahme_allgemein.baujahr_gebaeude = [1962];
gebaeude_aufnahme_allgemein.baujahr_heizung = [1952];
gebaeude_aufnahme_allgemein.saniert = true;
gebaeude_aufnahme_allgemein.einheiten = 1;
ausweis.ausstellgrund = "Vermietung";
ausweis.verbrauch_1 = 15000;
ausweis.verbrauch_2 = 14000;
ausweis.verbrauch_3 = 16000;
gebaeude.flaeche = 152;
gebaeude.nutzflaeche = 172;
gebaeude_aufnahme_allgemein.flaeche = 152;
gebaeude_aufnahme_allgemein.nutzflaeche = 172;
ausweis.keller_beheizt = true;
ausweis.brennstoff_1 = "Erdgas H";
gebaeude_aufnahme_allgemein.brennstoff_1 = "Erdgas H";
ausweis.einheit_1 = "kWh";
ausweis.anteil_warmwasser_1 = 18;
ausweis.startdatum = moment("12.01.2019").toDate();
gebaeude.plz = "21039";
gebaeude.ort = "Hamburg";
gebaeude.adresse = "Curslacker Deich 170";
gebaeude.gebaeudeteil = "Gesamtgebäude";
gebaeude_aufnahme_allgemein.gebaeudeteil = "Gesamtgebäude";
gebaeude = gebaeude;
ausweis = ausweis;
@@ -206,7 +210,7 @@
<Progressbar progress={0} />
</div>
<PerformanceScore bind:ausweis bind:gebaeude />
<PerformanceScore bind:ausweis bind:gebaeude bind:gebaeude_aufnahme_allgemein />
</div>
<form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
@@ -229,7 +233,7 @@
<Label>A - Prüfung der Ausweisart</Label>
<Ausweisart bind:gebaeude bind:ausweis />
<Ausweisart bind:gebaeude bind:gebaeude_aufnahme_allgemein bind:ausweis />
<hr />
@@ -297,7 +301,7 @@
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude.flaeche}
bind:value={gebaeude_aufnahme_allgemein.flaeche}
/>
</div>
</div>
@@ -309,7 +313,7 @@
<select
name="keller" data-test="keller"
required
bind:value={gebaeude.keller}
bind:value={gebaeude_aufnahme_allgemein.keller}
>
<option disabled>Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}>nicht vorhanden</option>
@@ -323,7 +327,7 @@
<div class="form-group col-md-3">
<Label>Dachgeschoss *</Label>
<div>
<select name="dachgeschoss" data-test="dachgeschoss" bind:value={gebaeude.dachgeschoss} required>
<select name="dachgeschoss" data-test="dachgeschoss" bind:value={gebaeude_aufnahme_allgemein.dachgeschoss} required>
<option disabled>Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}>nicht vorhanden</option>
<option value={Enums.Heizungsstatus.UNBEHEIZT}>unbeheizt</option>
@@ -349,7 +353,7 @@
autocomplete="off"
data-rule-minlength="2"
data-msg-minlength="min. 2 Zeichen"
bind:value={gebaeude.nutzflaeche}
bind:value={gebaeude_aufnahme_allgemein.nutzflaeche}
/>
</div>
</div>
@@ -360,7 +364,7 @@
<Label>C - Eingabe von 3 zusammenhängenden Verbrauchsjahren</Label>
<div class="GRB">
<Verbrauch bind:gebaeude bind:ausweis />
<Verbrauch bind:gebaeude bind:gebaeude_aufnahme_allgemein bind:ausweis />
</div>
<hr />
@@ -545,7 +549,7 @@
<select
name="lueftung" data-test="lueftung"
required
bind:value={gebaeude.lueftung}
bind:value={gebaeude_aufnahme_allgemein.lueftung}
>
<option disabled>Bitte auswählen</option>
<option value="Fensterlüftung">Fensterlüftung</option>
@@ -570,7 +574,7 @@
<select
name="kuehlung" data-test="kuehlung"
required
bind:value={gebaeude.kuehlung}
bind:value={gebaeude_aufnahme_allgemein.kuehlung}
>
<option disabled>Bitte auswählen</option>
<option value="1">vorhanden</option>
@@ -591,7 +595,7 @@
name="leerstand" data-test="leerstand"
maxlength="2"
type="number"
bind:value={gebaeude.leerstand}
bind:value={gebaeude_aufnahme_allgemein.leerstand}
/>
</div>
</div>
@@ -603,7 +607,7 @@
>F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
Gebäudes</Label
>
<BilderZusatzsysteme {images} {gebaeude} {ausweis} />
<BilderZusatzsysteme {images} {gebaeude} {gebaeude_aufnahme_allgemein} {ausweis} />
<hr />
<div class="flex flex-row justify-between">
<Hilfe />

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { BenutzerClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { BenutzerClient } from "#components/Ausweis/types";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import DashboardAusweisSkeleton from "#components/Dashboard/DashboardAusweisSkeleton.svelte";
import { client } from "src/trpc";

View File

@@ -1,9 +1,20 @@
<script lang="ts">
import { GebaeudeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import {
BenutzerClient,
GebaeudeAufnahmeClient,
GebaeudeClient,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types";
import AusweisPruefenBox from "#components/AusweisPruefenBox.svelte";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
export let ausweise: VerbrauchsausweisWohnenClient & { gebaeude_stammdaten: GebaeudeClient }[];
export let ausweise: (VerbrauchsausweisWohnenClient &
{
gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient & {
gebaeude_stammdaten: GebaeudeClient;
};
benutzer: BenutzerClient;
})[];
</script>
{#each ausweise as ausweis}
@@ -12,4 +23,4 @@
{:then calculations}
<AusweisPruefenBox {ausweis} {calculations}></AusweisPruefenBox>
{/await}
{/each}
{/each}

View File

@@ -5,25 +5,15 @@
import { Viewer } from "@pdfme/ui";
import { Check } from "radix-svelte-icons";
import { image, text } from "@pdfme/schemas";
import { AusweisData, convertAusweisData } from "#lib/AusweisData";
type AusweisData = VerbrauchsausweisWohnen & { benutzer: Benutzer, gebaeude_stammdaten: GebaeudeStammdaten, rechnungen: Rechnungen }
export let ausweise: AusweisData[];
let pdfInputs: AusweisData;
let template: Template;
let viewer: Viewer
function convertAusweisData(inputs: AusweisData): Record<string, string> {
return {
"gebaeude_stammdaten.adresse": inputs.gebaeude_stammdaten.adresse || "",
"gebaeude_stammdaten.gebaeudetyp": inputs.gebaeude_stammdaten.gebaeudetyp || "",
"gebaeude_stammdaten.baujahr_gebaeude": inputs.gebaeude_stammdaten.baujahr_gebaeude.join(", ") || "",
"gebaeude_stammdaten.baujahr_heizung": inputs.gebaeude_stammdaten.baujahr_heizung.join(", ") || "",
"gebaeude_stammdaten.plz": inputs.gebaeude_stammdaten.plz || "",
"gebaeude_stammdaten.ort": inputs.gebaeude_stammdaten.ort || "",
}
}
function loadTemplate() {

View File

@@ -1,5 +1,4 @@
<script lang="ts">
import { addNotification } from "@ibcornelsen/ui";
import { loginClient } from "#lib/login";
import CrossCircled from "radix-svelte-icons/src/lib/icons/CrossCircled.svelte";
import { fade } from "svelte/transition";
@@ -48,6 +47,7 @@
<input
class="input input-bordered text-base text-base-content font-medium"
type="password"
minlength="8"
placeholder="********"
name="passwort"
bind:value={passwort}

View File

@@ -79,6 +79,7 @@
<input
type="password"
placeholder="********"
minlength="8"
name="passwort"
class="input input-bordered text-base text-base-content font-medium"
bind:value={passwort}

View File

@@ -13,5 +13,5 @@ const redirect = Astro.url.searchParams.get("redirect")
---
<MinimalLayout title="Login">
<LoginModule client:only redirect={redirect}></LoginModule>
<LoginModule client:load redirect={redirect}></LoginModule>
</MinimalLayout>

View File

@@ -15,5 +15,5 @@ const redirect = Astro.url.searchParams.get("redirect");
---
<MinimalLayout title="Registrieren - IBCornelsen">
<RegisterModule client:only redirect={redirect}></RegisterModule>
<RegisterModule client:load redirect={redirect}></RegisterModule>
</MinimalLayout>

View File

@@ -15,7 +15,11 @@ if (!accessTokenValid) {
const ausweise = await prisma.verbrauchsausweisWohnen.findMany({
take: 10,
include: {
gebaeude_stammdaten: true,
gebaeude_aufnahme_allgemein: {
include: {
gebaeude_stammdaten: true
}
},
benutzer: true
}
})

View File

@@ -4,30 +4,34 @@ import AusweisLayout from "#layouts/AusweisLayout.astro";
import VerbrauchsausweisWohnenModule from "#modules/Ausweise/VerbrauchsausweisWohnenModule.svelte";
import { prisma } from "@ibcornelsen/database/server";
import { exclude } from "#lib/exclude";
import { UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, GebaeudeClient, BenutzerClient } from "#components/Ausweis/types";
import { UploadedGebaeudeBild, VerbrauchsausweisWohnenClient, GebaeudeClient, BenutzerClient, GebaeudeAufnahmeClient } from "#components/Ausweis/types";
import { createCaller } from "#lib/caller";
import { API_UID_COOKIE_NAME } from "#lib/constants";
const uid = Astro.url.searchParams.get("uid");
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
let gebaeude: GebaeudeClient = {} as GebaeudeClient;
let gebaeude_aufnahme_allgemein: GebaeudeAufnahmeClient = {} as GebaeudeAufnahmeClient;
let images: UploadedGebaeudeBild[] = [];
if (uid) {
const request = await prisma.verbrauchsausweisWohnen.findUnique({
where: { uid },
include: {
gebaeude_stammdaten: true
gebaeude_aufnahme_allgemein: {
include: {
GebaeudeStammdaten: {
include: {
gebaeude_bilder: true
}
}
}
}
}
})
if (request) {
const { gebaeude_stammdaten, ...rest } = request;
const gebaeudeBilder = await prisma.gebaeudeBilder.findMany({
where: { gebaeude_stammdaten_id: gebaeude_stammdaten.id },
});
images = (await Promise.all(gebaeudeBilder.map(async bild => {
images = (await Promise.all(request.gebaeude_aufnahme_allgemein.GebaeudeStammdaten.gebaeude_bilder.map(async bild => {
try {
const response = await createCaller(Astro).v1.bilder.getBase64({uid: bild.uid});
return {
@@ -40,8 +44,14 @@ if (uid) {
}
}))).filter(x => x !== null) as UploadedGebaeudeBild[];
ausweis = exclude(rest, ["id", "gebaeude_stammdaten_id", "ausweisart", "benutzer_id", "rechnungen_id"]) satisfies VerbrauchsausweisWohnenClient;
gebaeude = exclude(request.gebaeude_stammdaten, ["id", "benutzer_id"]) satisfies GebaeudeClient;
let { gebaeude_aufnahme_allgemein: {
GebaeudeStammdaten: { 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;
}
}

View File

@@ -1,13 +1,15 @@
---
import {
GebaeudeStammdaten,
VerbrauchsausweisWohnen,
prisma,
} from "@ibcornelsen/database/server";
import { generate } from "@pdfme/generator";
import moment from "moment";
import Checkbox from "#components/Checkbox.svelte";
import PDFHeader from "#components/PDF/PDFHeader.svelte";
import PDFSectionHeader from "#components/PDF/PDFSectionHeader.svelte";
import PDFLayout from "#layouts/PDFLayout.astro";
import { VerbrauchsausweisWohnen, GebaeudeStammdaten, prisma } from "@ibcornelsen/database/client";
import VerbrauchsausweisWohnen2016Template from "../../data/templates/verbrauchsausweis-wohnen-2016.json";
import { convertAusweisData } from "#lib/AusweisData";
import { variable } from "#lib/pdf/plugins/variables";
import { text, image } from "@pdfme/schemas"
const base64 = Astro.url.searchParams.get("base64");
let ausweis: (Partial<VerbrauchsausweisWohnen> & { gebaeude_stammdaten: Partial<GebaeudeStammdaten> }) | null = null;
@@ -36,231 +38,22 @@ if (!ausweis) {
return Astro.redirect("/404");
}
const gebaeude = ausweis.gebaeude_stammdaten;
---
const pdf = await generate({
template: VerbrauchsausweisWohnen2016Template,
plugins: { text, image, variable },
inputs: [convertAusweisData(ausweis)],
options: {
author: "IB Cornelsen",
creationDate: new Date(),
creator: "IB Cornelsen",
language: "de",
title: "Verbrauchsausweis Wohnen 2016",
},
});
<PDFLayout title="Ansichtsausweis">
<div class="flex flex-col gap-20">
<div class="flex flex-col gap-2">
<PDFHeader></PDFHeader>
<PDFSectionHeader number={1}>
<p class="text-xs">
Gültig bis: <span
>{
moment().add("10", "years").locale("de").format("DD. MMM. YYYY")
}</span>
</p>
<p class="text-xs">Ausweis ID <span>1293819</span></p>
<p class="text-xs">
Registriernummer wird nach Zahlungseingang vergeben
</p>
</PDFSectionHeader>
<div
class="border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg"
>
<h2>Gebäude</h2>
<div class="flex flex-col">
<div class="flex flex-row">
<table>
<tr>
<td>Gebäudetyp</td>
<td>{gebaeude.gebaeudetyp}</td>
</tr>
<tr>
<td>Adresse</td>
<td>{gebaeude.adresse}</td>
</tr>
<tr>
<td>Gebäudeteil</td>
<td>{gebaeude.gebaeudeteil}</td>
</tr>
<tr>
<td>Baujahr Gebäude ³</td>
<td>{gebaeude.baujahr_gebaeude}</td>
</tr>
<tr>
<td
>Baujahr Wärmeerzeuger <sup>3</sup>
<sup>4</sup></td
>
<td>{gebaeude.baujahr_heizung}</td>
</tr>
<tr>
<td>Anzahl Wohnungen</td>
<td>{gebaeude.einheiten}</td>
</tr>
<tr>
<td>Gebäudenutzfläche (A<sub>N</sub>)</td>
<td>
<table>
<tr>
<td>192m²</td>
<td
class="flex flex-row items-center h-full w-full gap-2 pl-2"
>
<input type="checkbox" />
nach § 19 EnEV aus der Wohnfläche ermittelt
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td
>Wesentliche Energieträger für<br /> Heizung und
Warmwasser <sup>3</sup></td
>
<td>Erdgas, BraunkohleBraunkohle, Strommix</td>
</tr>
</table>
<div class="w-[35%]">
<img src="" alt="" />
</div>
</div>
<div>
<table></table>
</div>
</div>
</div>
<div class="box">
<h2>
Hinweise zu den Angaben über die energetische Qualität des
Gebäudes
</h2>
<div class="bg-white w-full">
<p>
Die energetische Qualität eines Gebäudes kann durch die
Berechnung des <strong>Energiebedarfs</strong> unter Annahme
von standardisierten Randbedingungen oder durch die Auswertung
des <strong>Energieverbrauchs</strong> ermittelt werden. Als
Bezugsfläche dient die energetische Gebäudenutzfläche nach der
EnEV, die sich in der Regel von den allgemeinen Wohnflächenangaben
unterscheidet. Die angegebenen Vergleichswerte sollen überschlägige
Vergleiche ermöglichen (<strong
>Erläuterungen - siehe Seite 5</strong
>). Teil des Energieausweises sind die
Modernisierungsempfehlungen (Seite 4).
</p>
<Checkbox checked={true}>
Der Energieausweis wurde auf der Grundlage von Berechnungen
des <strong>Energiebedarfs</strong> erstellt (Energiebedarfsausweis).
Die Ergebnisse sind auf <strong>Seite 2</strong> dargestellt.
Zusätzliche Informationen zum Verbrauch sind freiwillig.
</Checkbox>
<Checkbox checked={false}>
Der Energieausweis wurde auf der Grundlage von Auswertungen
des <strong>Energieverbrauchs</strong> erstellt (Energieverbrauchsausweis).
Die Ergebnisse sind auf <strong>Seite 3</strong> dargestellt.
</Checkbox>
<div class="flex flex-row justify-between items-center w-[80%]">
<p>Datenerhebung Bedarf/Verbrauch durch</p>
<Checkbox checked={true}>Eigentümer</Checkbox>
<Checkbox checked={false}>Aussteller</Checkbox>
</div>
<Checkbox>
Dem Energieausweis sind zusätzliche Informationen zur
energetischen Qualität beigefügt (freiwillige Angabe).
</Checkbox>
</div>
</div>
<div class="box">
<h2>Hinweise zur Verwendung des Energieausweises</h2>
<p class="bg-white">
Der Energieausweis dient lediglich der Information. Die Angaben
im Energieausweis beziehen sich auf das gesamte Wohngebäude oder
den oben bezeichneten Gebäudeteil. Der Energieausweis ist
lediglich dafür gedacht, einen überschlägigen Vergleich von
Gebäuden zu ermöglichen.
</p>
</div>
<div class="flex flex-row gap-2">
<div class="bg-pdf-yellow-light rounded-lg p-2 w-full h-20">
<p>Aussteller:</p>
</div>
<div class="bg-pdf-yellow-light rounded-lg p-2 w-full h-20"></div>
</div>
<div class="flex flex-row flex-wrap">
<p>
<sup>1</sup> Datum der angewendeten EnEV, gegebenenfalls angewendeten
Änderungsverordnung zur EnEV
</p>
<p>
<sup>2</sup> Bei nicht rechtzeitiger Zuteilung der Registriernummer
(§ 17 Absatz 4 Satz 4 und 5 EnEV) ist das Datum der Antragstellung
einzutragen; die Registriernummer ist nach deren Eingang nachträglich
einzusetzen.
</p>
<p><sup>3</sup> Mehrfachangaben möglich</p>
<p><sup>4</sup> bei Wärmenetzen Baujahr der Übergabestation</p>
</div>
</div>
<div class="flex flex-col gap-2">
<PDFHeader></PDFHeader>
<PDFSectionHeader number={2}>
<p>Berechneter Energiebedarf des Gebäudes</p>
</PDFSectionHeader>
<div
class="box"
>
<h2>Energiebedarf</h2>
<div class="bg-white w-full flex flex-col">
<div class="flex flex-col items-end text-center">
<div class="flex flex-row">
<span class="bg-gray-300 p-0.5">200</span>
<span>kg/(m²a)</span>
</div>
<span>CO² Treibhausgas Emissionen</span>
</div>
</div>
</div>
</div>
</div>
</PDFLayout>
<style is:global>
table {
@apply w-full h-full;
}
td > table td {
@apply px-0 py-0 border-t-0 border-b-0;
}
td:has(table) {
@apply p-0;
}
td > table td:first-child {
@apply border-l-0;
}
td > table td:last-child {
@apply border-r-0;
}
td {
@apply border border-black px-1 text-xs py-0.5;
}
td:not(:first-child) {
@apply bg-white;
}
h2 {
@apply font-bold text-sm;
}
p,
label {
@apply text-xs;
}
.box {
@apply border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg;
}
.box > * {
@apply px-1 py-0.5;
}
</style>
return new Response(pdf, {
headers: {
"Content-Type": "application/pdf",
},
});
---

View File

@@ -1,13 +1,22 @@
---
import moment from "moment";
import Checkbox from "#components/Checkbox.svelte";
import DatenblattFooter from "#components/DatenblattFooter.svelte";
import DatenblattHeader from "#components/DatenblattHeader.svelte";
import PDFLayout from "#layouts/PDFLayout.astro";
import { GebaeudeStammdaten, VerbrauchsausweisWohnen, prisma } from "@ibcornelsen/database/client";
import {
GebaeudeStammdaten,
VerbrauchsausweisWohnen,
prisma,
} from "@ibcornelsen/database/server";
import { generate } from "@pdfme/generator";
import VerbrauchsausweisWohnen2016Template from "../../data/templates/verbrauchsausweis-wohnen-2016.json";
import { convertAusweisData } from "#lib/AusweisData";
import { variable } from "#lib/pdf/plugins/variables";
import { text, image } from "@pdfme/schemas"
const base64 = Astro.url.searchParams.get("base64");
let ausweis: (Partial<VerbrauchsausweisWohnen> & { gebaeude_stammdaten: Partial<GebaeudeStammdaten> }) | null = null;
let ausweis:
| (Partial<VerbrauchsausweisWohnen> & {
gebaeude_stammdaten: Partial<GebaeudeStammdaten>;
})
| null = null;
if (base64) {
const buffer = Buffer.from(base64, "base64");
const json = buffer.toString("utf-8");
@@ -33,494 +42,22 @@ if (!ausweis) {
return Astro.redirect("/404");
}
const gebaeude = ausweis.gebaeude_stammdaten;
const pdf = await generate({
template: VerbrauchsausweisWohnen2016Template,
plugins: { text, image, variable },
inputs: [convertAusweisData(ausweis)],
options: {
author: "IB Cornelsen",
creationDate: new Date(),
creator: "IB Cornelsen",
language: "de",
title: "Verbrauchsausweis Wohnen 2016",
},
});
return new Response(pdf, {
headers: {
"Content-Type": "application/pdf",
},
});
---
<PDFLayout title="Datenblatt">
<div class="flex flex-col gap-20">
<div class="flex flex-col gap-4">
<DatenblattHeader />
<div class="px-12 py-20 flex flex-col gap-2">
<div class="flex flex-row justify-between items-center">
<h2>Datenblatt Energieausweis</h2>
<h2>Ausweis ID:</h2>
</div>
<h3>Gebäudedaten:</h3>
<p>
Adresse: {gebaeude.adresse}, {
gebaeude.plz
}
{gebaeude.ort}
</p>
<div class="flex justify-between">
<Checkbox checked={ausweis.ausstellgrund == "Neubau"}>
Neubau
</Checkbox>
<Checkbox
checked={ausweis.ausstellgrund == "Vermietung" ||
ausweis.ausstellgrund == "Verkauf"}
>
Vermietung/Verkauf
</Checkbox>
<Checkbox
checked={ausweis.ausstellgrund == "Modernisierung"}
>
Modernisierung
</Checkbox>
<Checkbox checked={ausweis.ausstellgrund == "Sonstiges"}>
Sonstiges
</Checkbox>
</div>
<div class="flex justify-between gap-4">
<table>
<tbody
><tr>
<td>Baujahr Gebäude:</td>
<td
>{
gebaeude.baujahr_gebaeude
}</td
>
</tr>
<tr>
<td>Baujahr Heizung:</td>
<td
>{
gebaeude.baujahr_heizung
}</td
>
</tr>
<tr>
<td>Wohnfläche:</td>
<td>{gebaeude.flaeche}</td>
</tr>
<tr>
<td>Lüftungskonzept:</td>
<td>{gebaeude.lueftung}</td>
</tr>
<tr>
<td>Gebäudetyp:</td>
<td
>{
gebaeude.gebaeudetyp
}</td
>
</tr></tbody
>
</table>
<table>
<tbody
><tr>
<td>Dachgeschoss:</td>
<td
>{
gebaeude.dachgeschoss
? "Beheizt"
: gebaeude
.dachgeschoss
? "Unbeheizt"
: "Nicht Vorhanden"
}</td
>
</tr>
<tr>
<td>Beheizter Keller:</td>
<td>{ausweis.keller_beheizt ? "Ja" : "Nein"}</td
>
</tr>
<tr>
<td>Wohnungen:</td>
<td>{gebaeude.einheiten}</td>
</tr>
<tr>
<td>Anlage zur Kühlung:</td>
<td>{ausweis.wird_gekuehlt ? "Ja" : "Nein"}</td>
</tr>
<tr>
<td>Leerstand:</td>
<td>{gebaeude.leerstand}%</td
>
</tr></tbody
>
</table>
</div>
<div class="flex flex-row gap-8">
<div class="flex flex-col">
<h2>Heizverbrauch</h2>
<div class="flex flex-row justify-between gap-4">
<p>
Von: {
moment(ausweis.startdatum).format("MM.YYYY")
}
</p>
<p>
Bis: {
moment(ausweis.startdatum)
.add("1", "year")
.format("MM.YYYY")
}
</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>
Von: {
moment(ausweis.startdatum)
.add("1", "year")
.format("MM.YYYY")
}
</p>
<p>
Bis: {
moment(ausweis.startdatum)
.add("2", "years")
.format("MM.YYYY")
}
</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>
Von: {
moment(ausweis.startdatum)
.add("2", "years")
.format("MM.YYYY")
}
</p>
<p>
Bis: {
moment(ausweis.startdatum)
.add("3", "years")
.format("MM.YYYY")
}
</p>
</div>
</div>
<div class="flex flex-col">
<h2>{ausweis.brennstoff_1}</h2>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.verbrauch_1}</p>
<p>{ausweis.einheit_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.verbrauch_2}</p>
<p>{ausweis.einheit_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.verbrauch_3}</p>
<p>{ausweis.einheit_1}</p>
</div>
</div>
</div>
<div class="flex flex-row gap-8">
<div class="flex flex-col">
<h2>Heizverbrauch (Heizwert)</h2>
<div class="flex flex-row justify-between gap-4">
<p>
Von: {
moment(ausweis.startdatum).format("MM.YYYY")
}
</p>
<p>
Bis: {
moment(ausweis.startdatum)
.add("1", "year")
.format("MM.YYYY")
}
</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>
Von: {
moment(ausweis.startdatum)
.add("1", "year")
.format("MM.YYYY")
}
</p>
<p>
Bis: {
moment(ausweis.startdatum)
.add("2", "years")
.format("MM.YYYY")
}
</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>
Von: {
moment(ausweis.startdatum)
.add("2", "years")
.format("MM.YYYY")
}
</p>
<p>
Bis: {
moment(ausweis.startdatum)
.add("3", "years")
.format("MM.YYYY")
}
</p>
</div>
</div>
<div class="flex flex-col">
<h2>{ausweis.brennstoff_1}</h2>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.verbrauch_1}</p>
<p>{ausweis.einheit_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.verbrauch_2}</p>
<p>{ausweis.einheit_1}</p>
</div>
<div class="flex flex-row justify-between gap-4">
<p>{ausweis.verbrauch_3}</p>
<p>{ausweis.einheit_1}</p>
</div>
</div>
</div>
<p>
Warmwasser enthalten: {
ausweis.warmwasser_enthalten ? "Ja" : "Nein"
}
</p>
</div>
<DatenblattFooter />
</div>
<div class="flex flex-col gap-4">
<DatenblattHeader />
<div class="px-12 py-20 flex flex-col gap-2">
<h2>Modernisierungsstand</h2>
<h3>Heizungsanlage</h3>
<div class="grid grid-cols-3">
<Checkbox
checked={gebaeude.zentralheizung ||
false}
>
Zentral/Etage
</Checkbox>
<Checkbox
checked={gebaeude.einzelofen ||
false}
>
Einzelöfen
</Checkbox>
<Checkbox
checked={gebaeude
.durchlauf_erhitzer || false}
>
Durchlauferhitzer
</Checkbox>
<Checkbox
checked={gebaeude.standard_kessel ||
false}
>
Standardkessel
</Checkbox>
<Checkbox
checked={gebaeude
.solarsystem_warmwasser || false}
>
Solarsystem für Warmwasser
</Checkbox>
<Checkbox
checked={gebaeude.waermepumpe ||
false}
>
Wärmepumpe
</Checkbox>
<Checkbox
checked={gebaeude
.niedertemperatur_kessel || false}
>
Niedertemperaturkessel
</Checkbox>
<Checkbox
checked={gebaeude.brennwert_kessel ||
false}
>
Brennwertkessel/Therme
</Checkbox>
<Checkbox
checked={gebaeude
.warmwasser_rohre_gedaemmt || false}
>
Warmwasserrohre gedämmt
</Checkbox>
<Checkbox
checked={gebaeude
.heizungsrohre_gedaemmt || false}
>
Heizungsrohre gedämmt
</Checkbox>
<Checkbox
checked={gebaeude.zirkulation ||
false}
>
Zirkulation
</Checkbox>
<Checkbox
checked={gebaeude
.raum_temperatur_regler || false}
>
Raumtemperraturregler
</Checkbox>
</div>
<h3>Fenster/Dachfenster/Türen</h3>
<div class="grid grid-cols-3">
<Checkbox
checked={gebaeude
.einfach_verglasung || false}
>
Einfachglas
</Checkbox>
<Checkbox
checked={gebaeude
.doppel_verglasung || false}
>
Doppelverglasung
</Checkbox>
<Checkbox
checked={gebaeude
.isolier_verglasung || false}
>
Isolierverglasung
</Checkbox>
<Checkbox
checked={gebaeude
.dreifach_verglasung || false}
>
Dreifachverglasung
</Checkbox>
<Checkbox
checked={gebaeude.fenster_dicht ||
false}
>
Alle Fenster dicht
</Checkbox>
<Checkbox
checked={gebaeude
.fenster_teilweise_undicht || false}
>
Fenster teilweise undicht
</Checkbox>
<Checkbox
checked={gebaeude.tueren_dicht ||
false}
>
Alle Türen dicht
</Checkbox>
<Checkbox
checked={gebaeude.tueren_undicht ||
false}
>
Türen teilweise undicht
</Checkbox>
<Checkbox
checked={gebaeude
.rolllaeden_kaesten_gedaemmt || false}
>
Rolladenkästen gedämmt
</Checkbox>
</div>
<h3>Wärmedämmung</h3>
<div class="grid grid-cols-2">
<Checkbox
checked={gebaeude
.aussenwand_gedaemmt || false}
>
Außenwand gedämmt
</Checkbox>
<Checkbox
checked={gebaeude
.keller_wand_gedaemmt || false}
>
Kelleraußenwand gedämmt
</Checkbox>
<Checkbox
checked={gebaeude
.keller_decke_gedaemmt || false}
>
Kellerdecke gedämmt
</Checkbox>
<Checkbox
checked={gebaeude
.dachgeschoss_gedaemmt || false}
>
Dachgeschoss gedämmt
</Checkbox>
<Checkbox
checked={gebaeude
.oberste_geschossdecke_gedaemmt || false}
>
Oberste Geschossdecke gedämmt
</Checkbox>
<Checkbox
checked={gebaeude
.oberste_geschossdecke_min_12cm_gedaemmt || false}
>
Oberste Geschossdecke min. 12cm gedämmt
</Checkbox>
</div>
<Checkbox checked={true}>
Die Angaben sind richtig und entsprechen dem aktuellen
Stand.
</Checkbox>
<Checkbox checked={true}>
Ich habe die AGB gelesen und akzeptiert.
</Checkbox>
<p>
Die Angaben auf diesem Datenblatt wurden uns übermittelt und
werden zur Berechnung und Ausstellung des Ausweises
herangezogen.
</p>
</div>
<DatenblattFooter />
</div>
</div>
</PDFLayout>
<style is:global>
table {
@apply w-full h-full;
}
td > table td {
@apply px-0 py-0 border-t-0 border-b-0;
}
td:has(table) {
@apply p-0;
}
td > table td:first-child {
@apply border-l-0;
}
td > table td:last-child {
@apply border-r-0;
}
td {
@apply border border-black px-1 text-xs py-0.5;
}
td:not(:first-child) {
@apply bg-white;
}
h2 {
@apply font-bold text-sm;
}
p,
label {
@apply text-xs;
}
.box {
@apply border-4 border-pdf-yellow-bright bg-pdf-yellow-light rounded-lg;
}
.box > * {
@apply px-1 py-0.5;
}
</style>

View File

@@ -37,6 +37,7 @@ module.exports = {
'info': '#0689f4',
'success': '#04b964',
"success-content": "#ffffff",
'warning': '#f49d1a',
"warning-content": "#ffffff",
'error': '#e43f3f',