Verbesserungen und Datenumzug

This commit is contained in:
Moritz Utcke
2025-02-20 16:50:21 +11:00
parent 8049af9f17
commit d538f754c4
22 changed files with 1912 additions and 141 deletions

View File

@@ -9,6 +9,7 @@ import { fileURLToPath } from "url";
import * as fs from "fs";
import { transport } from "#lib/mail.js";
import { BASE_URI } from "#lib/constants.js";
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
export const GET = defineApiRoute({
input: z.object({
@@ -27,9 +28,9 @@ export const GET = defineApiRoute({
include: {
aufnahme: {
include: {
bilder: true,
objekt: {
include: {
bilder: true,
benutzer: true,
},
},
@@ -84,35 +85,35 @@ export const GET = defineApiRoute({
// $ausweis->erledigt = 2;
// $ausweis->save();
const pdfAusweis = await pdfVerbrauchsausweisWohnen(
const pdfAusweis = await getAnsichtsausweis(ausweis, ausweis.aufnahme, ausweis.aufnahme.objekt, ausweis.aufnahme.bilder, ausweis.aufnahme.objekt.benutzer)
const pdfDatenblatt = await getDatenblatt(
ausweis,
ausweis.aufnahme,
ausweis.aufnahme.objekt,
ausweis.aufnahme.bilder,
ausweis.aufnahme.objekt.benutzer
);
const pdfDatenblatt = await pdfDatenblattVerbrauchsausweisWohnen(
ausweis,
ausweis.aufnahme,
ausweis.aufnahme.objekt,
ausweis.aufnahme.objekt.benutzer
);
const pdfAusweisPath = fileURLToPath(
new URL(
`../../../../persistent/generated/Ausweis-${ausweis.uid}.pdf`,
import.meta.url
)
);
const pdfDatenblattPath = fileURLToPath(
new URL(
`../../../../persistent/generated/Datenblatt-${ausweis.uid}.pdf`,
import.meta.url
)
);
if (pdfAusweis) {
const pdfAusweisPath = fileURLToPath(
new URL(
`../../../../persistent/generated/Ausweis-${ausweis.uid}.pdf`,
import.meta.url
)
);
fs.writeFileSync(pdfAusweisPath, pdfAusweis);
}
fs.writeFileSync(pdfAusweisPath, pdfAusweis);
fs.writeFileSync(pdfDatenblattPath, pdfDatenblatt);
if (pdfDatenblatt) {
const pdfDatenblattPath = fileURLToPath(
new URL(
`../../../../persistent/generated/Datenblatt-${ausweis.uid}.pdf`,
import.meta.url
)
);
fs.writeFileSync(pdfDatenblattPath, pdfDatenblatt);
}
let text: string;

View File

@@ -148,7 +148,7 @@ export const GET = defineApiRoute({
}
}
},
output: ZodOverlap<OptionalNullable<GEGNachweisWohnenClient>>(GEGNachweisWohnenSchema.merge(z.object({
output: GEGNachweisWohnenSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
@@ -156,7 +156,7 @@ export const GET = defineApiRoute({
id: true,
aufnahme_id: true,
benutzer_id: true
})),
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;

View File

@@ -0,0 +1,9 @@
import { defineApiRoute } from "astro-typesafe-api/server";
// TODO
export const PUT = defineApiRoute({
async fetch(input, context, transfer) {
},
})

View File

@@ -1,5 +1,5 @@
import { z } from "zod";
import { BedarfsausweisWohnen, Enums, RechnungSchema, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen, prisma } from "@ibcornelsen/database/server";
import { Enums, RechnungSchema, prisma } from "@ibcornelsen/database/server";
import { mollieClient } from "#lib/mollie.js";
import { PaymentMethod } from "@mollie/api-client";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -8,6 +8,7 @@ import {
authorizationMiddleware,
} from "#lib/middleware/authorization.js";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
export const PUT = defineApiRoute({
meta: {
@@ -50,33 +51,21 @@ export const PUT = defineApiRoute({
// TODO: Services Implementieren
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
ausweis = await prisma.bedarfsausweisWohnen.findUnique({
where: {
uid: ausweis_uid
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
uid: ausweis_uid
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
// Wir müssen überprüfen, ob dem Nutzer der Ausweis tatsächlich gehört.
ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid: ausweis_uid,
},
});
} else {
const adapter = getPrismaAusweisAdapter(ausweis_uid);
if (!adapter) {
throw new APIError({
code: "BAD_REQUEST",
message: "Ausweisart nicht unterstützt.",
});
message: "Ungültige Ausweis UID"
})
}
const ausweis = await adapter.findUnique({
where: {
uid: ausweis_uid
}
})
if (!ausweis) {
throw new APIError({
code: "NOT_FOUND",
@@ -113,40 +102,14 @@ export const PUT = defineApiRoute({
});
}
if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
await prisma.bedarfsausweisWohnen.update({
where: {
uid: ausweis_uid
},
data: {
bestellt: true
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
await prisma.verbrauchsausweisGewerbe.update({
where: {
uid: ausweis_uid
},
data: {
bestellt: true
}
})
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
// Wir müssen überprüfen, ob dem Nutzer der Ausweis tatsächlich gehört.
await prisma.verbrauchsausweisWohnen.update({
where: {
uid: ausweis_uid
},
data: {
bestellt: true
}
});
} else {
throw new APIError({
code: "BAD_REQUEST",
message: "Ausweisart nicht unterstützt.",
});
}
await adapter.update({
where: {
uid: ausweis_uid
},
data: {
bestellt: true
}
})
if (bezahlmethode === Enums.Bezahlmethoden.rechnung) {
return { uid: rechnung.uid }
@@ -163,7 +126,7 @@ export const PUT = defineApiRoute({
},
method: input.bezahlmethode as PaymentMethod,
description: "Verbrauchsausweis Wohnen 2016",
redirectUrl: "https://ibcornelsen.de/payment/success",
redirectUrl: `https://ibcornelsen.de/payment/success?a=${ausweis.uid}&r=${rechnung.uid}`,
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.uid}`,
});

View File

@@ -2,36 +2,49 @@
import { Enums, prisma } from "@ibcornelsen/database/server";
import Layout from "../../layouts/Layout.astro";
import { createCaller } from "../../astro-typesafe-api-caller.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import PaymentSuccessModule from "#modules/PaymentSuccessModule.svelte";
import { sendPaymentSuccessMail } from "#lib/server/mail/payment-success";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
import { sendInvoiceMail } from "#lib/server/mail/invoice";
import { getCurrentUser } from "#lib/server/user";
const uid = Astro.url.searchParams.get("uid");
const uidRechnung = Astro.url.searchParams.get("r");
const uidAusweis = Astro.url.searchParams.get("a");
const user = await getCurrentUser(Astro)
const caller = createCaller(Astro)
const user = await caller.user.self.GET.fetch(undefined, {
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
if (!uid || !user) {
if (!uidRechnung || !uidAusweis || !user) {
return Astro.redirect("/")
}
const rechnung = await prisma.rechnung.findUnique({
where: {
uid: uid,
uid: uidRechnung,
benutzer: {
uid: user.uid
}
}
})
if (!rechnung) {
return Astro.redirect("/404")
const adapter = getPrismaAusweisAdapter(uidAusweis);
if (!adapter) {
return Astro.redirect("/")
}
const ausweis = adapter.findUnique({
where: {
uid: uidAusweis
}
})
if (!rechnung || !ausweis) {
return Astro.redirect("/")
}
if (rechnung.status === "paid") {
sendPaymentSuccessMail(ausweis, rechnung, user)
} else if (rechnung.bezahlmethode === Enums.Bezahlmethoden.rechnung) {
sendInvoiceMail(ausweis, rechnung, user)
}
---