This commit is contained in:
Moritz Utcke
2025-04-09 11:46:27 -04:00
parent 7665141a5a
commit 8daee69576
35 changed files with 307 additions and 194 deletions

View File

@@ -0,0 +1,17 @@
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisGewerbe';
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'BedarfsausweisWohnen';
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisGewerbe';
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'GEGNachweisWohnen';
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisGewerbe';
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ADD COLUMN "ausweisart" "Ausweisart" NOT NULL DEFAULT 'VerbrauchsausweisWohnen';

View File

@@ -26,6 +26,7 @@ model BedarfsausweisGewerbe {
klimatisierung Boolean? @default(false) klimatisierung Boolean? @default(false)
nachweistyp AusweisTyp @default(Standard) nachweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(BedarfsausweisGewerbe)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -100,6 +100,7 @@ model BedarfsausweisWohnen {
pruefpunkt_fenster Boolean? @default(false) pruefpunkt_fenster Boolean? @default(false)
ausweistyp AusweisTyp @default(Standard) ausweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(BedarfsausweisWohnen)
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)

View File

@@ -17,6 +17,7 @@ model GEGNachweisGewerbe {
beschreibung String? @db.Text beschreibung String? @db.Text
nachweistyp AusweisTyp @default(Standard) nachweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(GEGNachweisGewerbe)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -17,6 +17,7 @@ model GEGNachweisWohnen {
beschreibung String? @db.Text beschreibung String? @db.Text
nachweistyp AusweisTyp @default(Standard) nachweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(GEGNachweisWohnen)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -74,6 +74,7 @@ model VerbrauchsausweisGewerbe {
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())
ausweistyp AusweisTyp @default(Standard) ausweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(VerbrauchsausweisGewerbe)
pruefpunkt_heizungsalter Boolean? @default(false) pruefpunkt_heizungsalter Boolean? @default(false)
pruefpunkt_verbrauch_niedrig Boolean? @default(false) pruefpunkt_verbrauch_niedrig Boolean? @default(false)

View File

@@ -75,6 +75,7 @@ model VerbrauchsausweisWohnen {
kontrolldatei_angefragt Boolean? @default(false) kontrolldatei_angefragt Boolean? @default(false)
ausweistyp AusweisTyp @default(Standard) ausweistyp AusweisTyp @default(Standard)
ausweisart Ausweisart @default(VerbrauchsausweisWohnen)
created_at DateTime @default(now()) created_at DateTime @default(now())
updated_at DateTime @updatedAt @default(now()) updated_at DateTime @updatedAt @default(now())

View File

@@ -1,5 +1,4 @@
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { import {
@@ -566,7 +565,7 @@ export async function ausweisSpeichern(
return; return;
} }
aufnahme.id = aufnahme_id; aufnahme.id = aufnahme_id as string;
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
const id = await verbrauchsausweisWohnenSpeichern( const id = await verbrauchsausweisWohnenSpeichern(

View File

@@ -1,5 +1,4 @@
<script lang="ts"> <script lang="ts">
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte"; import ThickArrowDown from "radix-svelte-icons/src/lib/icons/ThickArrowDown.svelte";
import { import {
BedarfsausweisWohnenClient, BedarfsausweisWohnenClient,
@@ -9,8 +8,9 @@
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./types.js"; } from "./types.js";
import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte"; import ThickArrowUp from "radix-svelte-icons/src/lib/icons/ThickArrowUp.svelte";
import { Enums } from "#lib/client/prisma"; import { Enums } from "#lib/client/prisma.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
@@ -21,7 +21,9 @@
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000, [Enums.Ausweisart.VerbrauchsausweisGewerbe]: 1000,
[Enums.Ausweisart.VerbrauchsausweisWohnen]: 250, [Enums.Ausweisart.VerbrauchsausweisWohnen]: 250,
[Enums.Ausweisart.BedarfsausweisWohnen]: 250, [Enums.Ausweisart.BedarfsausweisWohnen]: 250,
[Enums.Ausweisart.BedarfsausweisGewerbe]: 250 [Enums.Ausweisart.BedarfsausweisGewerbe]: 0,
[Enums.Ausweisart.GEGNachweisGewerbe]: 0,
[Enums.Ausweisart.GEGNachweisWohnen]: 0,
}[ausweisart]; }[ausweisart];
/** /**
@@ -64,9 +66,9 @@
(async () => { (async () => {
let result; let result;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
result = await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt); result = await endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt);
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt); result = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt);
} }
if (!result) { if (!result) {

View File

@@ -398,7 +398,6 @@
{/if} {/if}
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN} {#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
<!-- TODO -->
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen} {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
<a <a
class="button text-sm" class="button text-sm"

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client" import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
export const BedarfsausweisGewerbeSchema = z.object({ export const BedarfsausweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -20,6 +20,7 @@ export const BedarfsausweisGewerbeSchema = z.object({
bauteilaktivierung: z.boolean().nullish(), bauteilaktivierung: z.boolean().nullish(),
klimatisierung: z.boolean().nullish(), klimatisierung: z.boolean().nullish(),
nachweistyp: z.nativeEnum(AusweisTyp), nachweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client" import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
export const BedarfsausweisWohnenSchema = z.object({ export const BedarfsausweisWohnenSchema = z.object({
id: z.string(), id: z.string(),
@@ -86,6 +86,7 @@ export const BedarfsausweisWohnenSchema = z.object({
pruefpunkt_geometrie: z.boolean().nullish(), pruefpunkt_geometrie: z.boolean().nullish(),
pruefpunkt_fenster: z.boolean().nullish(), pruefpunkt_fenster: z.boolean().nullish(),
ausweistyp: z.nativeEnum(AusweisTyp), ausweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
rechnung_id: z.string().nullish(), rechnung_id: z.string().nullish(),
aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"), aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"),
}) })

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client" import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
export const GEGNachweisGewerbeSchema = z.object({ export const GEGNachweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -10,6 +10,7 @@ export const GEGNachweisGewerbeSchema = z.object({
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(), zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(), beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
nachweistyp: z.nativeEnum(AusweisTyp), nachweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client" import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
export const GEGNachweisWohnenSchema = z.object({ export const GEGNachweisWohnenSchema = z.object({
id: z.string(), id: z.string(),
@@ -10,6 +10,7 @@ export const GEGNachweisWohnenSchema = z.object({
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(), zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(), beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
nachweistyp: z.nativeEnum(AusweisTyp), nachweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client" import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
export const VerbrauchsausweisGewerbeSchema = z.object({ export const VerbrauchsausweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -52,6 +52,7 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
ausweistyp: z.nativeEnum(AusweisTyp), ausweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
pruefpunkt_heizungsalter: z.boolean().nullish(), pruefpunkt_heizungsalter: z.boolean().nullish(),
pruefpunkt_verbrauch_niedrig: z.boolean().nullish(), pruefpunkt_verbrauch_niedrig: z.boolean().nullish(),
pruefpunkt_verbrauch_hoch: z.boolean().nullish(), pruefpunkt_verbrauch_hoch: z.boolean().nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client" import { Ausstellgrund, AusweisTyp, Ausweisart } from "@prisma/client"
export const VerbrauchsausweisWohnenSchema = z.object({ export const VerbrauchsausweisWohnenSchema = z.object({
id: z.string().describe("ID des Ausweises"), id: z.string().describe("ID des Ausweises"),
@@ -38,6 +38,7 @@ export const VerbrauchsausweisWohnenSchema = z.object({
beschreibung: z.string().nullish(), beschreibung: z.string().nullish(),
kontrolldatei_angefragt: z.boolean().describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde").nullish(), kontrolldatei_angefragt: z.boolean().describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde").nullish(),
ausweistyp: z.nativeEnum(AusweisTyp), ausweistyp: z.nativeEnum(AusweisTyp),
ausweisart: z.nativeEnum(Ausweisart),
created_at: z.date(), created_at: z.date(),
updated_at: z.date(), updated_at: z.date(),
pruefpunkt_heizungsalter: z.boolean().nullish(), pruefpunkt_heizungsalter: z.boolean().nullish(),

View File

@@ -28,6 +28,8 @@ export async function getVerbrauchsausweisWohnenKomplett(id: string) {
}) })
} }
export type VerbrauchsausweisWohnenKomplett = Awaited<ReturnType<typeof getVerbrauchsausweisWohnenKomplett>>;
export async function getVerbrauchsausweisGewerbe(id: string): Promise<VerbrauchsausweisGewerbe | null> { export async function getVerbrauchsausweisGewerbe(id: string): Promise<VerbrauchsausweisGewerbe | null> {
return await prisma.verbrauchsausweisGewerbe.findUnique({ return await prisma.verbrauchsausweisGewerbe.findUnique({
where: { where: {

View File

@@ -1,37 +1,52 @@
import { getAusweisartFromId } from "#components/Ausweis/types.js"; import { getAusweisartFromId } from "#components/Ausweis/types.js";
import moment from "moment"; import moment from "moment";
import { createLexOfficeCustomer } from "./lexoffice.js"; import { createLexOfficeCustomer } from "./lexoffice.js";
import { Enums, prisma, Rechnung, VerbrauchsausweisWohnen } from "./prisma.js"; import { Enums, prisma, Rechnung } from "./prisma.js";
import { LEX_OFFICE_API_KEY, PRICES } from "#lib/constants.js"; import { LEX_OFFICE_API_KEY, PRICES } from "#lib/constants.js";
import { VerbrauchsausweisWohnenKomplett } from "./db.js";
export function createLineItem(name: string, preis: number, steuer: number) { export function createLineItem(name: string, preis: number, steuer: number) {
return { return {
"type": "custom", type: "custom",
"name": name, name: name,
"description": "", description: "",
"quantity": 1, quantity: 1,
"lineItemAmount": preis, lineItemAmount: preis,
"unitName": name, unitName: name,
"unitPrice": { unitPrice: {
"currency": "EUR", currency: "EUR",
"grossAmount": preis, grossAmount: preis,
"taxRatePercentage": steuer taxRatePercentage: steuer,
} },
}; };
} }
export function addedServicesNeu(data: any, rechnung: Rechnung, steuer: number){ type LineItem = ReturnType<typeof createLineItem>;
if (rechnung.services.includes(Enums.Service.Qualitaetsdruck)){
data["lineItems"].push(createLineItem('Zusatzservice Postversand', 9, steuer)) export function addedServicesNeu(
data: any,
rechnung: Rechnung,
steuer: number
) {
if (rechnung.services.includes(Enums.Service.Qualitaetsdruck)) {
data["lineItems"].push(
createLineItem("Zusatzservice Postversand", 9, steuer)
);
} }
if (rechnung.services.includes(Enums.Service.Aushang)){ if (rechnung.services.includes(Enums.Service.Aushang)) {
data["lineItems"].push(createLineItem('Zusatzservice Aushang', 10, steuer)) data["lineItems"].push(
createLineItem("Zusatzservice Aushang", 10, steuer)
);
} }
if (rechnung.services.includes(Enums.Service.SameDay)){ if (rechnung.services.includes(Enums.Service.SameDay)) {
data["lineItems"].push(createLineItem('Zusatzservice Same Day Service', 29, steuer)) data["lineItems"].push(
createLineItem("Zusatzservice Same Day Service", 29, steuer)
);
} }
if (rechnung.services.includes(Enums.Service.Telefonberatung)){ if (rechnung.services.includes(Enums.Service.Telefonberatung)) {
data["lineItems"].push(createLineItem('Zusatzservice Telefonische Beratung', 75, steuer)) data["lineItems"].push(
createLineItem("Zusatzservice Telefonische Beratung", 75, steuer)
);
} }
return data; return data;
@@ -45,16 +60,23 @@ export function addedServicesNeu(data: any, rechnung: Rechnung, steuer: number){
* @return array * @return array
* @throws Error * @throws Error
*/ */
export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung: Rechnung) { export async function createInvoice(
ausweis: VerbrauchsausweisWohnenKomplett,
rechnung: Rechnung
) {
if (!ausweis) {
throw new Error("Ausweis ist null");
}
if (!ausweis.benutzer_id) { if (!ausweis.benutzer_id) {
throw new Error("Benutzer ist nicht vorhanden") throw new Error("Benutzer ist nicht vorhanden");
} }
const user = await prisma.benutzer.findUnique({ const user = await prisma.benutzer.findUnique({
where: { where: {
id: ausweis.benutzer_id id: ausweis.benutzer_id,
} },
}) });
if (!user) { if (!user) {
throw new Error("Nutzer existiert nicht!"); throw new Error("Nutzer existiert nicht!");
@@ -66,126 +88,195 @@ export async function createInvoice(ausweis: VerbrauchsausweisWohnen, rechnung:
await prisma.benutzer.update({ await prisma.benutzer.update({
where: { where: {
id: user.id id: user.id,
}, },
data: { data: {
lex_office_id: user.lex_office_id lex_office_id: user.lex_office_id,
} },
}) });
} }
const ausweisart = getAusweisartFromId(ausweis.id); const ausweisart = getAusweisartFromId(ausweis.id);
let data = { let data = {
"voucherDate": moment().format('YYYY-MM-DDTHH:mm:ss.SSSZ'), voucherDate: moment().format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
"taxConditions": { taxConditions: {
"taxType": "gross" taxType: "gross",
}, },
"shippingConditions": { shippingConditions: {
"shippingType": "none" shippingType: "none",
}, },
"address": { address: {
"contactId": user.lex_office_id, contactId: user.lex_office_id,
"name": rechnung.empfaenger || "----", name: rechnung.empfaenger || "----",
"street": rechnung.strasse, street: rechnung.strasse,
"city": rechnung.ort, city: rechnung.ort,
"zip": rechnung.plz, zip: rechnung.plz,
"countryCode": "DE", countryCode: "DE",
"supplement": rechnung.zusatzzeile supplement: rechnung.zusatzzeile,
}, },
"lineItems": [], lineItems: [] as LineItem[],
"totalPrice": { totalPrice: {
"currency": "EUR", currency: "EUR",
"totalGrossAmount": rechnung.betrag, totalGrossAmount: rechnung.betrag,
}, },
"title": "Rechnung", title: "Rechnung",
"introduction": "Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung", introduction:
"remark": "Vielen Dank für Ihren Einkauf." "Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung",
remark: "Vielen Dank für Ihren Einkauf.",
}; };
if (rechnung.status == Enums.Rechnungsstatus.paid) { if (rechnung.status == Enums.Rechnungsstatus.paid) {
const types = { const types: Record<Enums.Bezahlmethoden, string> = {
[Enums.Bezahlmethoden.paypal]: "PayPal", [Enums.Bezahlmethoden.paypal]: "PayPal",
[Enums.Bezahlmethoden.creditcard]: "Kreditkarte", [Enums.Bezahlmethoden.creditcard]: "Kreditkarte",
[Enums.Bezahlmethoden.sofort]: "Sofortüberweisung", [Enums.Bezahlmethoden.sofort]: "Sofortüberweisung",
[Enums.Bezahlmethoden.giropay]: "Giropay", [Enums.Bezahlmethoden.giropay]: "Giropay",
[Enums.Bezahlmethoden.rechnung]: "Rechnung",
}; };
const type = types[rechnung.bezahlmethode]; const type = types[rechnung.bezahlmethode];
data["introduction"] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`; data[
"introduction"
] = `Vielen Dank für Ihren Einkauf (Ausweis ID ${ausweis.id}). Ihre Rechnung haben sie bereits mit ${type} bezahlt.`;
} }
const tax_rate = 19; const tax_rate = 19;
if (rechnung.betrag == 15) { if (rechnung.betrag == 15) {
// Korrektur alleinstehend // Korrektur alleinstehend
data["lineItems"].push(createLineItem("Service Korrektur anfordern", rechnung.betrag, 19)); data["lineItems"].push(
createLineItem("Service Korrektur anfordern", rechnung.betrag, 19)
);
} else if (rechnung.betrag == 476) { } else if (rechnung.betrag == 476) {
data["lineItems"].push(createLineItem("GEG Berechnung Wohngebäude", rechnung.betrag, 19)); data["lineItems"].push(
createLineItem("GEG Berechnung Wohngebäude", rechnung.betrag, 19)
);
} else if (rechnung.betrag > 400 && rechnung.betrag != 476) { } else if (rechnung.betrag > 400 && rechnung.betrag != 476) {
data["lineItems"].push(createLineItem("Bedarfsausweis Gewerbe", rechnung.betrag, 19)); data["lineItems"].push(
createLineItem("Bedarfsausweis Gewerbe", rechnung.betrag, 19)
);
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19)); data["lineItems"].push(
createLineItem(
`Verbrauchsausweis Online (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Standard,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
data["lineItems"].push(createLineItem(`Verbrauchsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19)); data["lineItems"].push(
createLineItem(
`Verbrauchsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Beratung,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
data["lineItems"].push(createLineItem(`Verbrauchsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19)); data["lineItems"].push(
createLineItem(
`Verbrauchsausweis Offline (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Offline,
19
)
);
} }
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) { } else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
data["lineItems"].push(createLineItem(`Bedarfsausweis Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Standard, 19)); data["lineItems"].push(
createLineItem(
`Bedarfsausweis Online (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Standard,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
data["lineItems"].push(createLineItem(`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Beratung, 19)); data["lineItems"].push(
createLineItem(
`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Beratung,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
data["lineItems"].push(createLineItem(`Bedarfsausweis Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisWohnen.Offline, 19)); data["lineItems"].push(
createLineItem(
`Bedarfsausweis Offline (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Offline,
19
)
);
} }
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) { if (ausweis.ausweistyp == Enums.AusweisTyp.Standard) {
data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Standard, 19)); data["lineItems"].push(
createLineItem(
`Verbrauchsausweis Nichtwohngebäude Online (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisGewerbe.Standard,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Beratung) {
data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Online (Vorprüfung negativ) (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Beratung, 19)); data["lineItems"].push(
createLineItem(
`Verbrauchsausweis Nichtwohngebäude Online (Vorprüfung negativ) (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisGewerbe.Beratung,
19
)
);
} else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) { } else if (ausweis.ausweistyp == Enums.AusweisTyp.Offline) {
data["lineItems"].push(createLineItem(`Verbrauchsausweis Nichtwohngebäude Offline (ID ${ausweis.id})`, PRICES.VerbrauchsausweisGewerbe.Offline, 19)); data["lineItems"].push(
createLineItem(
`Verbrauchsausweis Nichtwohngebäude Offline (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisGewerbe.Offline,
19
)
);
} }
} }
data = addedServicesNeu(data, rechnung, 19); data = addedServicesNeu(data, rechnung, 19);
const response = await fetch(
const response = await fetch("https://api.lexoffice.io/v1/invoices?finalize=true", { "https://api.lexoffice.io/v1/invoices?finalize=true",
method: "POST", {
headers: { method: "POST",
Accept: `application/json`, headers: {
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`, Accept: `application/json`,
"Content-Type": "application/json" Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
}, "Content-Type": "application/json",
body: JSON.stringify(data) },
}) body: JSON.stringify(data),
}
);
if (response.status == 400) { if (response.status == 400) {
throw new Error("Fehler beim Absenden der Request.") throw new Error("Fehler beim Absenden der Request.");
} }
const invoice = await response.json() const invoice = await response.json();
// Wir müssen den Ausweis nun wieder abfragen, um die erstellte Rechnungsnummer zu bekommen. // Wir müssen den Ausweis nun wieder abfragen, um die erstellte Rechnungsnummer zu bekommen.
const response_id = invoice["id"]; const response_id = invoice["id"];
const request = await fetch(`https://api.lexoffice.io/v1/invoices/${response_id}`, { const request = await fetch(
method: "GET", `https://api.lexoffice.io/v1/invoices/${response_id}`,
headers: { {
Accept: `application/json`, method: "GET",
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`, headers: {
"Content-Type": "application/json" Accept: `application/json`,
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
"Content-Type": "application/json",
},
} }
}) );
const abfrage_response = await request.json() const abfrage_response = await request.json();
return { return {
id: invoice["id"], id: invoice["id"],
voucherNumber: abfrage_response["voucherNumber"] voucherNumber: abfrage_response["voucherNumber"],
} };
} }

View File

@@ -27,7 +27,7 @@
<span>{user.vorname} {user.name}</span> <span>{user.vorname} {user.name}</span>
<span class="text-xs">{user.email}</span> <span class="text-xs">{user.email}</span>
</div> </div>
<a href="/dashboard/admin/impersonate?uid={user.uid}" class="button text-sm">Einloggen</a> <a href="/dashboard/admin/impersonate?id={user.id}" class="button text-sm">Einloggen</a>
</div> </div>
{/each} {/each}
</div> </div>

View File

@@ -32,6 +32,8 @@
import { getMaximumDevitationInPercent } from "#client/lib/helpers.js"; import { getMaximumDevitationInPercent } from "#client/lib/helpers.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js"; import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js"; import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
export let user: Partial<BenutzerClient>; export let user: Partial<BenutzerClient>;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
@@ -394,33 +396,6 @@
} }
} }
/**
* TODO
* Ausschlusskriterien: Neubau, Modernisierung
Baujahr vor 1978, unsaniert und bis 4 Wohneinheiten /
Heizung jünger als 3 Jahre / Verbrauchsjahre unvollständig / Verbrauchsjahre nicht aktuell genug /
Klimafaktoren unvollständig /
Leerstand größer 30% /
Fehlende oder unvollständige Bilder (pro Abschnitt mindestens ein Bild) /
Fehlende Angaben zum Sanierungsstand (Bei F mindestens 2 Haken), (Bei G mindestens 1 Haken)
*/
let bestellenNichtMoeglich = false;
if (
((ausweis.ausstellgrund === "Neubau" ||
ausweis.ausstellgrund === "Modernisierung") &&
aufnahme.baujahr_gebaeude[0] < 1978 &&
aufnahme.saniert === false &&
aufnahme.einheiten &&
aufnahme.einheiten > 4) ||
new Date().getFullYear() - aufnahme.baujahr_heizung[0] < 3 ||
!ausweis.verbrauch_1 ||
!ausweis.verbrauch_2 ||
!ausweis.verbrauch_3 ||
(aufnahme.leerstand && aufnahme.leerstand > 30)
) {
bestellenNichtMoeglich = true;
}
const gegAnfrage = const gegAnfrage =
ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisWohnen ||
ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe ||
@@ -924,7 +899,7 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
<h3>Bitte untenstehende Punkte bestätigen. Bitte gehen Sie gegebenenfalls zurück zum Formular und überprüfen bzw. korrigieren Ihre Eingaben.</h3> <h3>Bitte untenstehende Punkte bestätigen. Bitte gehen Sie gegebenenfalls zurück zum Formular und überprüfen bzw. korrigieren Ihre Eingaben.</h3>
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe} {#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
{@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt)} {@const request = ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen ? endEnergieVerbrauchVerbrauchsausweis_2016_Client(ausweis, aufnahme, objekt) : endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client(ausweis, aufnahme, objekt)}
{#await request} {#await request}

View File

@@ -20,7 +20,11 @@ import { PutObjectCommand } from "@aws-sdk/client-s3";
import { s3Client } from "#lib/s3.js"; import { s3Client } from "#lib/s3.js";
import { createInvoice } from "#lib/server/invoice.js"; import { createInvoice } from "#lib/server/invoice.js";
import { tryCatch } from "#lib/tryCatch.js"; import { tryCatch } from "#lib/tryCatch.js";
import { getBedarfsausweisWohnenKomplett, getVerbrauchsausweisGewerbeKomplett, getVerbrauchsausweisWohnenKomplett } from "#lib/server/db.js"; import {
getBedarfsausweisWohnenKomplett,
getVerbrauchsausweisGewerbeKomplett,
getVerbrauchsausweisWohnenKomplett,
} from "#lib/server/db.js";
export const GET = defineApiRoute({ export const GET = defineApiRoute({
input: z.object({ input: z.object({
@@ -40,18 +44,18 @@ export const GET = defineApiRoute({
aufnahme: Aufnahme & { aufnahme: Aufnahme & {
bilder: Bild[]; bilder: Bild[];
objekt: Objekt & { objekt: Objekt & {
benutzer: Benutzer; benutzer: Benutzer | null;
}; };
}; };
}) })
| null = null; | null = null;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis) ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis);
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis) ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis);
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis) ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis);
} }
if (!ausweis) { if (!ausweis) {
@@ -81,22 +85,24 @@ export const GET = defineApiRoute({
} }
if (!rechnung.lex_office_id) { if (!rechnung.lex_office_id) {
const [result, error] = await tryCatch(createInvoice(ausweis, rechnung)); const [result, error] = await tryCatch(
createInvoice(ausweis, rechnung)
);
if (error) { if (error) {
return return;
} }
const { id, voucherNumber } = result; const { id, voucherNumber } = result;
await prisma.rechnung.update({ await prisma.rechnung.update({
where: { where: {
id: rechnung.id id: rechnung.id,
}, },
data: { data: {
lex_office_id: id lex_office_id: id,
} },
}) });
} }
const pdfAusweis = await getAnsichtsausweis( const pdfAusweis = await getAnsichtsausweis(
@@ -123,7 +129,7 @@ export const GET = defineApiRoute({
ACL: "private", ACL: "private",
}); });
const response = await s3Client.send(command); await s3Client.send(command);
} }
if (pdfDatenblatt) { if (pdfDatenblatt) {
@@ -134,7 +140,7 @@ export const GET = defineApiRoute({
ACL: "private", ACL: "private",
}); });
const response = await s3Client.send(command); await s3Client.send(command);
} }
let text: string; let text: string;
@@ -230,30 +236,30 @@ fax 040 · 209339859
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
await prisma.verbrauchsausweisWohnen.update({ await prisma.verbrauchsausweisWohnen.update({
where: { where: {
id: ausweis.id id: ausweis.id,
},
data: {
ausgestellt: true
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
await prisma.verbrauchsausweisGewerbe.update({
where: {
id: ausweis.id
},
data: {
ausgestellt: true
}
})
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
await prisma.bedarfsausweisWohnen.update({
where: {
id: ausweis.id
}, },
data: { data: {
ausgestellt: true, ausgestellt: true,
} },
}) });
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
await prisma.verbrauchsausweisGewerbe.update({
where: {
id: ausweis.id,
},
data: {
ausgestellt: true,
},
});
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
await prisma.bedarfsausweisWohnen.update({
where: {
id: ausweis.id,
},
data: {
ausgestellt: true,
},
});
} }
}, },
}); });

View File

@@ -1,4 +1,4 @@
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js"; import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true zurueckgestellt: true,
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true zurueckgestellt: true,
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -1,9 +1,9 @@
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js"; import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js"; import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { BedarfsausweisWohnen, 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 { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js"; import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
import { z } from "zod"; import { z } from "zod";
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
zurueckgestellt: true, zurueckgestellt: true,
created_at: true, created_at: true,
updated_at: true, updated_at: true,
storniert: true storniert: true,
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -29,6 +29,7 @@ export const PUT = defineApiRoute({
created_at: true, created_at: true,
updated_at: true, updated_at: true,
storniert: true, storniert: true,
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix, aufnahme_id: UUidWithPrefix,
}), }),

View File

@@ -1,4 +1,4 @@
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js"; import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true zurueckgestellt: true,
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true zurueckgestellt: true,
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -19,7 +19,8 @@ export const PATCH = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true zurueckgestellt: true,
ausweisart: true
}), }),
output: z.void(), output: z.void(),
headers: { headers: {

View File

@@ -25,7 +25,8 @@ export const PUT = defineApiRoute({
rechnung_id: true, rechnung_id: true,
storniert: true, storniert: true,
updated_at: true, updated_at: true,
zurueckgestellt: true zurueckgestellt: true,
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -14,7 +14,8 @@ export const PATCH = defineApiRoute({
benutzer_id: true, benutzer_id: true,
aufnahme_id: true, aufnahme_id: true,
updated_at: true, updated_at: true,
created_at: true created_at: true,
ausweisart: true
}).merge(z.object({ }).merge(z.object({
startdatum: z.coerce.date().nullable(), startdatum: z.coerce.date().nullable(),
})), })),

View File

@@ -21,7 +21,8 @@ export const PUT = defineApiRoute({
aufnahme_id: true, aufnahme_id: true,
rechnung_id: true, rechnung_id: true,
updated_at: true, updated_at: true,
created_at: true created_at: true,
ausweisart: true
}).merge(z.object({ }).merge(z.object({
startdatum: z.coerce.date().nullable() startdatum: z.coerce.date().nullable()
})), })),

View File

@@ -15,7 +15,8 @@ export const PATCH = defineApiRoute({
aufnahme_id: true, aufnahme_id: true,
rechnung_id: true, rechnung_id: true,
created_at: true, created_at: true,
updated_at: true updated_at: true,
ausweisart: true
}).merge(z.object({ }).merge(z.object({
startdatum: z.coerce.date().nullable() startdatum: z.coerce.date().nullable()
})), })),

View File

@@ -26,7 +26,8 @@ export const PUT = defineApiRoute({
aufnahme_id: true, aufnahme_id: true,
rechnung_id: true, rechnung_id: true,
created_at: true, created_at: true,
updated_at: true updated_at: true,
ausweisart: true
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

@@ -10,7 +10,6 @@ import ImpersonateUserModule from "#modules/ImpersonateUserModule.svelte";
const caller = createCaller(Astro) const caller = createCaller(Astro)
const params = Astro.params; const params = Astro.params;
const page = Number(params.page)
const user = await caller.user.self.GET.fetch(undefined, { const user = await caller.user.self.GET.fetch(undefined, {
headers: { headers: {

View File

@@ -22,15 +22,15 @@ if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
return Astro.redirect("/dashboard") return Astro.redirect("/dashboard")
} }
const uid = Astro.url.searchParams.get("uid") const id = Astro.url.searchParams.get("id")
if (!uid) { if (!id) {
return Astro.redirect("/404") return Astro.redirect("/404")
} }
const searchedUser = await prisma.benutzer.findUnique({ const searchedUser = await prisma.benutzer.findUnique({
where: { where: {
uid id
} }
}) })
@@ -40,12 +40,12 @@ if (!searchedUser) {
const refreshTokenExpiry = moment().add(30, "days"); const refreshTokenExpiry = moment().add(30, "days");
const accessToken = encodeToken({ const accessToken = encodeToken({
uid: searchedUser.uid, id: searchedUser.id,
typ: TokenType.Access, typ: TokenType.Access,
exp: moment().add(30, "minutes").valueOf(), exp: moment().add(30, "minutes").valueOf(),
}); });
const refreshToken = encodeToken({ const refreshToken = encodeToken({
uid: searchedUser.uid, id: searchedUser.id,
typ: TokenType.Refresh, typ: TokenType.Refresh,
exp: refreshTokenExpiry.valueOf(), exp: refreshTokenExpiry.valueOf(),
}); });
@@ -60,7 +60,6 @@ Astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, accessToken, {
path: "/", path: "/",
expires: moment().add(30, "minutes").toDate() expires: moment().add(30, "minutes").toDate()
}) })
Astro.cookies.set("uid", searchedUser.uid)
return Astro.redirect("/dashboard") return Astro.redirect("/dashboard")
--- ---