Verbrauchsausweis Gewerbe

This commit is contained in:
Moritz Utcke
2025-03-08 14:46:16 -03:00
parent c4de916057
commit c3c7fd313f
24 changed files with 266 additions and 102 deletions

View File

@@ -453,6 +453,7 @@ Table VerbrauchsausweisGewerbe {
alternative_lueftung Boolean alternative_lueftung Boolean
alternative_kuehlung Boolean alternative_kuehlung Boolean
warmwasser_enthalten Boolean warmwasser_enthalten Boolean
warmwasser_anteil_bekannt Boolean [note: '@zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")']
anteil_warmwasser_1 Float anteil_warmwasser_1 Float
anteil_warmwasser_2 Float anteil_warmwasser_2 Float
ausgestellt Boolean [default: false] ausgestellt Boolean [default: false]

View File

@@ -0,0 +1,48 @@
-- AlterTable
ALTER TABLE "Anteilshaber" ALTER COLUMN "uid" SET DEFAULT 'ant-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Aufnahme" ALTER COLUMN "uid" SET DEFAULT 'auf-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'bag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'baw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Bild" ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Event" ALTER COLUMN "uid" SET DEFAULT 'evt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGEinpreisung" ALTER COLUMN "uid" SET DEFAULT 'gge-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Objekt" ALTER COLUMN "uid" SET DEFAULT 'obj-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Rechnung" ALTER COLUMN "uid" SET DEFAULT 'inv-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Tickets" ALTER COLUMN "uid" SET DEFAULT 'tkt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Unterlage" ALTER COLUMN "uid" SET DEFAULT 'pln-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ADD COLUMN "warmwasser_anteil_bekannt" BOOLEAN,
ALTER COLUMN "uid" SET DEFAULT 'vag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'vaw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "benutzer" ALTER COLUMN "uid" SET DEFAULT 'usr-' || gen_random_uuid();

View File

@@ -42,6 +42,8 @@ model VerbrauchsausweisGewerbe {
alternative_kuehlung Boolean? alternative_kuehlung Boolean?
warmwasser_enthalten Boolean? warmwasser_enthalten Boolean?
/// @zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")
warmwasser_anteil_bekannt Boolean?
anteil_warmwasser_1 Float? anteil_warmwasser_1 Float?
anteil_warmwasser_2 Float? anteil_warmwasser_2 Float?

View File

@@ -12,13 +12,13 @@ export const createCaller = createCallerFactory({
"admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"), "admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"),
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"), "admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
"admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"), "admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"), "aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"), "ausweise": await import("../src/pages/api/ausweise/index.ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"), "auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"), "auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"), "bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
"geg-nachweis-gewerbe/[uid]": await import("../src/pages/api/geg-nachweis-gewerbe/[uid].ts"), "geg-nachweis-gewerbe/[uid]": await import("../src/pages/api/geg-nachweis-gewerbe/[uid].ts"),
"geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"), "geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"),

View File

@@ -653,9 +653,8 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<input <input
name="stromverbrauch_enthaelt_sonstige" name="stromverbrauch_enthaelt_sonstige"
type="number" type="text"
bind:value={ausweis.stromverbrauch_enthaelt_sonstige} bind:value={ausweis.stromverbrauch_enthaelt_sonstige}
required
/> />
<div class="help-label"> <div class="help-label">

View File

@@ -1,8 +1,9 @@
<script lang="ts"> <script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte"; import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte"; import Inputlabel from "#components/labels/InputLabel.svelte";
import { VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let ausweis; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
$: { $: {
if (!ausweis.warmwasser_enthalten) { if (!ausweis.warmwasser_enthalten) {

View File

@@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import { AufnahmeKomplettClient, getAusweisartFromUUID, ObjektKomplettClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeKomplettClient, BedarfsausweisWohnenClient, getAusweisartFromUUID, ObjektKomplettClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import moment from "moment"; import moment from "moment";
import { dialogs } from "svelte-dialogs"; import { dialogs } from "svelte-dialogs";
import { import {
@@ -13,9 +13,10 @@
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { Enums, Objekt } from "#lib/client/prisma"; import { Enums, Objekt } from "#lib/client/prisma.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeKomplettClient; export let aufnahme: AufnahmeKomplettClient;
export let objekt: Objekt; export let objekt: Objekt;
export let progress: number; export let progress: number;
@@ -65,9 +66,18 @@
} }
let hilfeModal: HTMLDialogElement; let hilfeModal: HTMLDialogElement;
let calculations = null;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
calculations = endEnergieVerbrauchVerbrauchsausweis_2016(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt);
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
calculations = endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt);
}
</script> </script>
<div class="card lg:card-side relative bg-base-200 card-bordered border-base-300"> <div class="relative bg-base-200 border border-base-300 rounded-lg p-4">
{#if ausweis.storniert} {#if ausweis.storniert}
<div <div
class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none" class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none"
@@ -79,14 +89,6 @@
</h1> </h1>
</div> </div>
{/if} {/if}
<!-- <figure class="lg:w-1/2">
<img
src={(bilder.length > 0 && `/bilder/${bilder[0].uid}.webp`) ||
"/images/placeholder.jpg"}
class="object-cover w-full h-full"
alt="Gebäudebild"
/>
</figure> -->
<div class="card-body"> <div class="card-body">
<div <div
class="flex justify-end mb-2 dropdown dropdown-bottom absolute top-4 right-4" class="flex justify-end mb-2 dropdown dropdown-bottom absolute top-4 right-4"
@@ -113,23 +115,25 @@
</li> </li>
</ul> </ul>
</div> </div>
<div class="flex flex-row flex-wrap gap-2"> <div class="flex flex-row flex-wrap items-center gap-2">
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen} {#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
<div class="badge badge-accent font-semibold text-secondary text-lg"> <div class="text-lg font-semibold">
Verbrauchsausweis Wohnen Verbrauchsausweis Wohnen
</div> </div>
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen} {:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen}
<div class="badge badge-accent font-semibold"> <div class="text-lg font-semibold">
Bedarfsausweis Wohnen Bedarfsausweis Wohnen
</div> </div>
{:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe} {:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe}
<div class="badge badge-accent font-semibold"> <div class="text-lg font-semibold">
Verbrauchsausweis Gewerbe Verbrauchsausweis Gewerbe
</div> </div>
{/if} {/if}
{#if ausweis.ausgestellt} {#if ausweis.ausgestellt}
<div class="badge badge-success font-semibold">Ausgestellt</div> <span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
{:else if ausweis.bestellt}
<span class="bg-yellow-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
{/if} {/if}
</div> </div>
<div class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div> <div class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div>
@@ -141,7 +145,7 @@
>{progress}%</span >{progress}%</span
> >
</div> </div>
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) then calculations} {#await calculations then calculations}
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<div class="flex flex-row justify-between"> <div class="flex flex-row justify-between">
<span>Energieverbrauch</span> <span>Energieverbrauch</span>
@@ -183,22 +187,28 @@
<div class="flex flex-row justify-between"> <div class="flex flex-row justify-between">
<span>ID</span> <span>ID</span>
<span class="font-bold text-base-content" <span class="font-bold text-base-content"
>{ausweis.uid.split("-")[0]}</span >{ausweis.uid}</span
> >
</div> </div>
</div> </div>
{/await} {/await}
<div class="flex flex-row justify-end gap-4 mt-4"> <div class="flex flex-row justify-end gap-4 mt-4">
{#if !ausweis.storniert && !ausweis.ausgestellt}
<a <a
class="button text-sm" class="button text-sm"
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid={ausweis.uid}" href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid={ausweis.uid}"
>Stornieren</a> >Stornieren</a>
{/if}
{#if !ausweis.ausgestellt}
<!-- TODO -->
<a <a
class="button text-sm" class="button text-sm"
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid={ausweis.uid}" href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid={ausweis.uid}"
>Freigeben</a> >Bearbeiten</a>
{/if}
<a <a
class="p-2 rounded-lg hover:bg-gray-200" class="p-2 rounded-lg hover:bg-gray-200"

View File

@@ -1,6 +1,6 @@
import { AufnahmeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
export function auditBedarfsausweisBenoetigt(ausweis: VerbrauchsausweisWohnenClient, gebaeude: AufnahmeClient): boolean { export function auditBedarfsausweisBenoetigt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient, gebaeude: AufnahmeClient): boolean {
if (ausweis.ausstellgrund == "Neubau" || ausweis.ausstellgrund == "Modernisierung") { if (ausweis.ausstellgrund == "Neubau" || ausweis.ausstellgrund == "Modernisierung") {
return true; return true;
} }

View File

@@ -1,9 +1,9 @@
import { ObjektClient, VerbrauchsausweisWohnenClient, AufnahmeClient } from "#components/Ausweis/types.js"; import { ObjektClient, VerbrauchsausweisWohnenClient, AufnahmeClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
export async function auditEndEnergie(ausweis: VerbrauchsausweisWohnenClient, objekt: ObjektClient, aufnahme: AufnahmeClient): Promise<boolean> { export async function auditEndEnergie(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient, objekt: ObjektClient, aufnahme: AufnahmeClient): Promise<boolean> {
if (hidden.has(AuditType.END_ENERGIE)) { if (hidden.has(AuditType.END_ENERGIE)) {
return false; return false;
} }

View File

@@ -1,12 +1,13 @@
import { import {
ObjektClient, ObjektClient,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
import { getKlimafaktoren } from "#lib/Klimafaktoren.js"; import { getKlimafaktoren } from "#lib/Klimafaktoren.js";
export async function auditKlimaFaktoren( export async function auditKlimaFaktoren(
ausweis: VerbrauchsausweisWohnenClient, ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient,
gebaeude: ObjektClient gebaeude: ObjektClient
): Promise<boolean> { ): Promise<boolean> {
if (hidden.has(AuditType.KLIMA_FAKTOREN)) { if (hidden.has(AuditType.KLIMA_FAKTOREN)) {

View File

@@ -1,7 +1,7 @@
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
export function auditWarmWasser(ausweis: VerbrauchsausweisWohnenClient): boolean { export function auditWarmWasser(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient): boolean {
if (ausweis.warmwasser_anteil_bekannt && ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1) { if (ausweis.warmwasser_anteil_bekannt && ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1) {
if (!hidden.has(AuditType.WARM_WASSER)){ if (!hidden.has(AuditType.WARM_WASSER)){

View File

@@ -1,7 +1,7 @@
import { ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AuditType, hidden } from "./hidden.js"; import { AuditType, hidden } from "./hidden.js";
export function auditZeitraumAktuell(ausweis: VerbrauchsausweisWohnenClient, gebaeude: ObjektClient): boolean { export function auditZeitraumAktuell(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient, gebaeude: ObjektClient): boolean {
if (hidden.has(AuditType.ZEITRAUM_AKTUELL)) { if (hidden.has(AuditType.ZEITRAUM_AKTUELL)) {
return false; return false;
} }

View File

@@ -1,23 +1,23 @@
export * from "./anteilshaber.js" export * from "./anteilshaber"
export * from "./apirequests.js" export * from "./apirequests"
export * from "./aufnahme.js" export * from "./aufnahme"
export * from "./bedarfsausweisgewerbe.js" export * from "./bedarfsausweisgewerbe"
export * from "./bedarfsausweiswohnen.js" export * from "./bedarfsausweiswohnen"
export * from "./benutzer.js" export * from "./benutzer"
export * from "./bild.js" export * from "./bild"
export * from "./event.js" export * from "./event"
export * from "./gegeinpreisung.js" export * from "./gegeinpreisung"
export * from "./gegnachweisgewerbe.js" export * from "./gegnachweisgewerbe"
export * from "./gegnachweiswohnen.js" export * from "./gegnachweiswohnen"
export * from "./klimafaktoren.js" export * from "./klimafaktoren"
export * from "./objekt.js" export * from "./objekt"
export * from "./postleitzahlen.js" export * from "./postleitzahlen"
export * from "./rechnung.js" export * from "./rechnung"
export * from "./refreshtokens.js" export * from "./refreshtokens"
export * from "./tickets.js" export * from "./tickets"
export * from "./unterlage.js" export * from "./unterlage"
export * from "./verbrauchsausweisgewerbe.js" export * from "./verbrauchsausweisgewerbe"
export * from "./verbrauchsausweiswohnen.js" export * from "./verbrauchsausweiswohnen"
export * from "./documenttemplates.js" export * from "./documenttemplates"
export * from "./documenttypes.js" export * from "./documenttypes"
export * from "./tokens.js" export * from "./tokens"

View File

@@ -37,6 +37,7 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
alternative_lueftung: z.boolean().nullish(), alternative_lueftung: z.boolean().nullish(),
alternative_kuehlung: z.boolean().nullish(), alternative_kuehlung: z.boolean().nullish(),
warmwasser_enthalten: z.boolean().nullish(), warmwasser_enthalten: z.boolean().nullish(),
warmwasser_anteil_bekannt: z.boolean().describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen").nullish(),
anteil_warmwasser_1: z.number().nullish(), anteil_warmwasser_1: z.number().nullish(),
anteil_warmwasser_2: z.number().nullish(), anteil_warmwasser_2: z.number().nullish(),
ausgestellt: z.boolean().nullish(), ausgestellt: z.boolean().nullish(),

View File

@@ -81,7 +81,7 @@ export async function sendInvoiceMail(
<tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td> <tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td>
<tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td> <tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td>
<tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td> <tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.uid}</b></td> <tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.id}</b></td>
</table> </table>
<br> <br>

View File

@@ -9,18 +9,12 @@
export let aufnahme: AufnahmeKomplettClient; export let aufnahme: AufnahmeKomplettClient;
export let objekt: Objekt; export let objekt: Objekt;
import { onMount } from "svelte";
let dropdownOpen = false; let dropdownOpen = false;
function toggleDropdown() { function toggleDropdown() {
dropdownOpen = !dropdownOpen; dropdownOpen = !dropdownOpen;
} }
function closeDropdown() {
dropdownOpen = false;
}
</script> </script>
<h1>{objekt.adresse}, {objekt.plz} {objekt.ort}</h1> <h1>{objekt.adresse}, {objekt.plz} {objekt.ort}</h1>
@@ -34,9 +28,9 @@
{#if dropdownOpen} {#if dropdownOpen}
<div class="absolut mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation> <div class="absolut mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
<div class="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> <div class="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<button class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Wohnen Erstellen</button> <a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?aufnahme={aufnahme.uid}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Wohnen Erstellen</a>
<button class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Gewerbe Erstellen</button> <a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?aufnahme={aufnahme.uid}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Gewerbe Erstellen</a>
<button class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis Erstellen</button> <a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?aufnahme={aufnahme.uid}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis Erstellen</a>
</div> </div>
</div> </div>
{/if} {/if}

View File

@@ -19,7 +19,7 @@
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
import { BenutzerClient } from "#components/Ausweis/types.js"; import { BenutzerClient } from "#components/Ausweis/types.js";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte"; import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
import { Enums } from "#lib/client/prisma"; import { Enums } from "#lib/client/prisma.js";
import moment from "moment"; import moment from "moment";
import { import {
AuditType, AuditType,
@@ -37,7 +37,11 @@
import { auditWohnFlaeche } from "#components/Verbrauchsausweis/audits/WohnFlaeche.js"; import { auditWohnFlaeche } from "#components/Verbrauchsausweis/audits/WohnFlaeche.js";
import { auditWohnflaecheGroesserGesamtflaeche } from "#components/Verbrauchsausweis/audits/WohnflaecheGroesserGesamtflaeche.js"; import { auditWohnflaecheGroesserGesamtflaeche } from "#components/Verbrauchsausweis/audits/WohnflaecheGroesserGesamtflaeche.js";
import { auditZeitraumAktuell } from "#components/Verbrauchsausweis/audits/ZeitraumAktuell.js"; import { auditZeitraumAktuell } from "#components/Verbrauchsausweis/audits/ZeitraumAktuell.js";
import { notifications, RawNotificationWrapper, RawNotification } from "@ibcornelsen/ui"; import {
RawNotificationWrapper,
RawNotification,
notifications,
} from "#components/Notifications/index.js";
export let ausweis: VerbrauchsausweisGewerbeClient; export let ausweis: VerbrauchsausweisGewerbeClient;
export let user: BenutzerClient; export let user: BenutzerClient;
@@ -116,10 +120,13 @@
localStorage.setItem("objekt", JSON.stringify(objekt)) localStorage.setItem("objekt", JSON.stringify(objekt))
localStorage.setItem("bilder", JSON.stringify(bilder)) localStorage.setItem("bilder", JSON.stringify(bilder))
} }
let form: HTMLFormElement;
let skala: HTMLDivElement;
</script> </script>
<div id="skala" class="bg-white grid grid-cols-1 px-0 sm:p-4 lg:grid-cols-2 lg:gap-x-6"> <div id="skala" bind:this={skala} class="bg-white grid grid-cols-1 px-0 sm:p-4 lg:grid-cols-2 lg:gap-x-6">
<PerformanceScore <PerformanceScore
bind:ausweis bind:ausweis
@@ -138,7 +145,7 @@
<!-- TODO: Submit implementieren in externer Datei wenn Verbrauchsausweis Wohnen fertig ist --> <!-- TODO: Submit implementieren in externer Datei wenn Verbrauchsausweis Wohnen fertig ist -->
<form id="formInput-1" data-cy="ausweis" name="ausweis"> <form id="formInput-1" data-cy="ausweis" name="ausweis" bind:this={form}>
<div id="formular-box" class="formular-boxen ring-0"> <div id="formular-box" class="formular-boxen ring-0">
<ButtonWeiterHilfe <ButtonWeiterHilfe
@@ -147,8 +154,10 @@
bind:user bind:user
bind:objekt bind:objekt
bind:aufnahme bind:aufnahme
ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen} ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={false} showWeiter={false}
{form}
{skala}
> >
</ButtonWeiterHilfe> </ButtonWeiterHilfe>
@@ -261,6 +270,9 @@
bind:objekt bind:objekt
bind:aufnahme bind:aufnahme
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe} ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={true}
{form}
{skala}
> >
</ButtonWeiterHilfe> </ButtonWeiterHilfe>

View File

@@ -1,8 +1,9 @@
import { AufnahmeClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; import { AufnahmeClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { AufnahmeSchema, prisma } from "#lib/server/prisma.js"; import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { AufnahmeSchema } from "src/generated/zod/aufnahme.js";
import { z } from "zod"; import { z } from "zod";
export const PATCH = defineApiRoute({ export const PATCH = defineApiRoute({
@@ -22,7 +23,7 @@ export const PATCH = defineApiRoute({
where: { where: {
uid, uid,
benutzer_id: user.id benutzer_id: user.id
}, }
}); });
if (!aufnahme) { if (!aufnahme) {

View File

@@ -1,5 +1,5 @@
import { z } from "zod"; import { z } from "zod";
import { Enums, RechnungSchema, prisma } from "#lib/server/prisma"; import { Enums, prisma } from "#lib/server/prisma.js";
import { mollieClient } from "#lib/mollie.js"; import { mollieClient } from "#lib/mollie.js";
import { PaymentMethod } from "@mollie/api-client"; import { PaymentMethod } from "@mollie/api-client";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -10,6 +10,8 @@ import {
import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js"; import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
import { PRICES, SERVICES } from "#lib/constants.js"; import { PRICES, SERVICES } from "#lib/constants.js";
import { Rechnung } from "#lib/client/prisma.js";
import { RechnungSchema } from "src/generated/zod/rechnung.js";
export const PUT = defineApiRoute({ export const PUT = defineApiRoute({
meta: { meta: {
@@ -28,7 +30,6 @@ export const PUT = defineApiRoute({
.merge( .merge(
RechnungSchema.omit({ RechnungSchema.omit({
benutzer_id: true, benutzer_id: true,
aufnahme_id: true,
bezahlt_am: true, bezahlt_am: true,
erstellt_am: true, erstellt_am: true,
id: true, id: true,
@@ -86,9 +87,10 @@ export const PUT = defineApiRoute({
}); });
} }
// TODO
// Wir erstellen eine neue Rechnung in unserer Datenbank. // Wir erstellen eine neue Rechnung in unserer Datenbank.
const rechnung = await prisma.rechnung.create({ let rechnung: Rechnung | null = null;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
rechnung = await prisma.rechnung.create({
data: { data: {
benutzer_id: user.id, benutzer_id: user.id,
betrag, betrag,
@@ -101,12 +103,41 @@ export const PUT = defineApiRoute({
}, },
services, services,
ausweistyp ausweistyp
}, }
select: {
uid: true,
betrag: true,
},
}); });
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
rechnung = await prisma.rechnung.create({
data: {
benutzer_id: user.id,
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
verbrauchsausweis_gewerbe: {
connect: {
uid: ausweis_uid
}
},
services,
ausweistyp
}
});
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
rechnung = await prisma.rechnung.create({
data: {
benutzer_id: user.id,
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
bedarfsausweis_wohnen: {
connect: {
uid: ausweis_uid
}
},
services,
ausweistyp
}
});
}
if (!rechnung) { if (!rechnung) {
throw new APIError({ throw new APIError({

View File

@@ -1,7 +1,8 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma, VerbrauchsausweisGewerbeSchema } from "#lib/server/prisma"; import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { VerbrauchsausweisGewerbeSchema } from "src/generated/zod/verbrauchsausweisgewerbe.js";
import { z } from "zod"; import { z } from "zod";
export const PUT = defineApiRoute({ export const PUT = defineApiRoute({
@@ -17,7 +18,9 @@ export const PUT = defineApiRoute({
benutzer_id: true, benutzer_id: true,
uid: true, uid: true,
aufnahme_id: true aufnahme_id: true
}), }).merge(z.object({
startdatum: z.coerce.date()
})),
uid_aufnahme: UUidWithPrefix uid_aufnahme: UUidWithPrefix
}), }),
output: z.object({ output: z.object({

View File

@@ -8,6 +8,7 @@ import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte"; import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
const uid = Astro.url.searchParams.get("uid"); const uid = Astro.url.searchParams.get("uid");
const uid_aufnahme = Astro.url.searchParams.get("aufnahme")
let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient; let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient; let objekt: ObjektClient = {} as ObjektClient;
@@ -75,6 +76,32 @@ if (uid) {
"/energieausweis-erstellen/verbrauchsausweis-gewerbe" "/energieausweis-erstellen/verbrauchsausweis-gewerbe"
); );
} }
} else if (uid_aufnahme) {
if (!valid) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
let { uid_objekt, ...result} = await caller.aufnahme._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_aufnahme
}
})
aufnahme = result;
objekt = await caller.objekt._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_objekt
}
})
} }
--- ---

View File

@@ -8,6 +8,7 @@ import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import { Enums } from "#lib/server/prisma"; import { Enums } from "#lib/server/prisma";
const uid = Astro.url.searchParams.get("uid"); const uid = Astro.url.searchParams.get("uid");
const uid_aufnahme = Astro.url.searchParams.get("aufnahme")
const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard; const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard;
@@ -76,6 +77,32 @@ if (uid) {
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
); );
} }
} else if (uid_aufnahme) {
if (!valid) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
let { uid_objekt, ...result} = await caller.aufnahme._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_aufnahme
}
})
aufnahme = result;
objekt = await caller.objekt._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_objekt
}
})
} }
--- ---

View File

@@ -660,6 +660,7 @@ export function fakeVerbrauchsausweisGewerbe() {
alternative_lueftung: undefined, alternative_lueftung: undefined,
alternative_kuehlung: undefined, alternative_kuehlung: undefined,
warmwasser_enthalten: undefined, warmwasser_enthalten: undefined,
warmwasser_anteil_bekannt: undefined,
anteil_warmwasser_1: undefined, anteil_warmwasser_1: undefined,
anteil_warmwasser_2: undefined, anteil_warmwasser_2: undefined,
prueftext: undefined, prueftext: undefined,
@@ -703,6 +704,7 @@ export function fakeVerbrauchsausweisGewerbeComplete() {
alternative_lueftung: undefined, alternative_lueftung: undefined,
alternative_kuehlung: undefined, alternative_kuehlung: undefined,
warmwasser_enthalten: undefined, warmwasser_enthalten: undefined,
warmwasser_anteil_bekannt: undefined,
anteil_warmwasser_1: undefined, anteil_warmwasser_1: undefined,
anteil_warmwasser_2: undefined, anteil_warmwasser_2: undefined,
ausgestellt: false, ausgestellt: false,

View File

@@ -32,6 +32,10 @@ module.exports = {
'base-content': '#1e2734', 'base-content': '#1e2734',
'box-heading': '#3A4AB5', 'box-heading': '#3A4AB5',
'accent': '#7b37cd',
'accent-focus': '#5f25a7',
'accent-content': '#ffffff',
"formular-box": "rgba(252,234,187,0.2)", "formular-box": "rgba(252,234,187,0.2)",
"formular-rahmen": "rgba(255,204,6,1)", "formular-rahmen": "rgba(255,204,6,1)",