Bestellung

This commit is contained in:
Moritz Utcke
2025-02-20 17:07:49 +11:00
parent 727ea1c924
commit eac6f0c035
7 changed files with 272 additions and 216 deletions

View File

@@ -1,56 +0,0 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import ZipSearch from "#components/PlzSuche.svelte";
import { Bezahlmethoden, Enums } from "@ibcornelsen/database/client";
import PaymentOption from "#components/PaymentOption.svelte";
export let selectedPaymentType: Bezahlmethoden =
Enums.Bezahlmethoden.paypal;
</script>
<div id="bezahlung" class="bereich-box grid
grid-cols-5 justify-around justify-items-center items-center">
<PaymentOption
paymentType={Enums.Bezahlmethoden.paypal}
bind:selectedPaymentType
name={"PayPal"}
icon={"/images/paypal.png"}
></PaymentOption>
<PaymentOption
paymentType={Enums.Bezahlmethoden.sofort}
bind:selectedPaymentType
name={"Sofort"}
icon={"/images/sofort.png"}
></PaymentOption>
<PaymentOption
paymentType={Enums.Bezahlmethoden.giropay}
bind:selectedPaymentType
name={"Giropay"}
icon={"/images/giropay.png"}
></PaymentOption>
<PaymentOption
paymentType={Enums.Bezahlmethoden.creditcard}
bind:selectedPaymentType
name={"Kreditkarte"}
icon={"/images/creditcard.png"}
></PaymentOption>
<PaymentOption
paymentType={Enums.Bezahlmethoden.rechnung}
bind:selectedPaymentType
name={"Rechnung"}
icon={"/images/rechnung.png"}
></PaymentOption>
</div>

View File

@@ -1,33 +1,27 @@
<script lang="ts"> <script lang="ts">
import type { Bezahlmethoden } from "@ibcornelsen/database/client"; import type { Bezahlmethoden } from "@ibcornelsen/database/client";
import Input from "radix-svelte-icons/src/lib/icons/Input.svelte";
export let name: string; export let name: string;
export let icon: string; export let icon: string;
export let paymentType: Bezahlmethoden; export let bezahlmethode: Bezahlmethoden;
export let selectedPaymentType: Bezahlmethoden; export let aktiveBezahlmethode: Bezahlmethoden;
</script> </script>
<div> <div>
<input
type="radio"
data-cy={bezahlmethode}
id={bezahlmethode}
name="paymentType"
on:change={() => (aktiveBezahlmethode = bezahlmethode)}
/>
<input type="radio" data-cy={paymentType} id={paymentType} name="paymentType" on:change={() => selectedPaymentType = paymentType} /> <label for={bezahlmethode}>
<div
<label for={paymentType}> class="grid grid-rows-[1fr_20px] justify-items-center items-center cursor-pointer"
<div class="grid grid-rows-[1fr_20px] justify-items-center items-center cursor-pointer"> >
<img src={icon} alt={name} /> <img src={icon} alt={name} />
{name} {name}
</div> </div>
</label> </label>
</div>
</div>
<!--
<button type="button" class="bg-white px-4 py-2" on:click={() => selectedPaymentType = paymentType}>
<div class="grid grid-rows-[max-content-max-content] w-fit">
<img src={icon} alt={name} />
<span aria-label={name}>
{name}
</span>
</div>
</button>
-->

View File

@@ -21,16 +21,42 @@ export enum VALID_UUID_PREFIXES {
"gnw" = "GEG Nachweis Wohnen" "gnw" = "GEG Nachweis Wohnen"
} }
export enum AusweisTyp {
Standard,
Beratung,
Offline
}
/** /**
* Ein Objekt welches alle definierten Preise für unsere Basisprodukte enthält. * Ein Objekt welches alle definierten Preise für unsere Basisprodukte enthält.
*/ */
export const PRICES: Record<Enums.Ausweisart, [number, number, number]> = { export const PRICES: Record<Enums.Ausweisart, Record<AusweisTyp, number>> = {
// per E-Mail , inkl.Beratung, offline // per E-Mail , inkl.Beratung, offline
BedarfsausweisWohnen: [95, 125, 295], BedarfsausweisWohnen: {
VerbrauchsausweisWohnen: [65, 95, 180], [AusweisTyp.Standard]: 95,
VerbrauchsausweisGewerbe: [95, 125, 360], [AusweisTyp.Beratung]: 125,
BedarfsausweisGewerbe: [500, 700, 1000], [AusweisTyp.Offline]: 295
GEGNachweisWohnen: [500, 700, 1000] },
VerbrauchsausweisWohnen: {
[AusweisTyp.Standard]: 65,
[AusweisTyp.Beratung]: 95,
[AusweisTyp.Offline]: 180
},
VerbrauchsausweisGewerbe: {
[AusweisTyp.Standard]: 95,
[AusweisTyp.Beratung]: 125,
[AusweisTyp.Offline]: 360
},
BedarfsausweisGewerbe: {
[AusweisTyp.Standard]: 500,
[AusweisTyp.Beratung]: 700,
[AusweisTyp.Offline]: 1000
},
GEGNachweisWohnen: {
[AusweisTyp.Standard]: 500,
[AusweisTyp.Beratung]: 700,
[AusweisTyp.Offline]: 1000
}
}; };
export const SERVICES: Record< export const SERVICES: Record<

View File

@@ -15,6 +15,8 @@ export async function sendInvoiceMail(
rechnung: Rechnung, rechnung: Rechnung,
user: Benutzer user: Benutzer
) { ) {
console.log(ausweis);
const aufnahme = await prisma.aufnahme.findUnique({ const aufnahme = await prisma.aufnahme.findUnique({
where: { where: {
id: ausweis.aufnahme_id, id: ausweis.aufnahme_id,

View File

@@ -4,12 +4,15 @@
import Bereich from "#components/labels/Bereich.svelte"; import Bereich from "#components/labels/Bereich.svelte";
import Ansprechpartner from "#components/Ausweis/Ansprechpartner.svelte"; import Ansprechpartner from "#components/Ausweis/Ansprechpartner.svelte";
import Rechnungsadresse from "#components/Ausweis/Rechnungsadresse.svelte"; import Rechnungsadresse from "#components/Ausweis/Rechnungsadresse.svelte";
import Bezahlung from "#components/Ausweis/Bezahlung.svelte";
import type { Bezahlmethoden } from "@ibcornelsen/database/client"; import type { Bezahlmethoden } from "@ibcornelsen/database/client";
import { Enums } from "@ibcornelsen/database/client"; import { Enums } from "@ibcornelsen/database/client";
import { dialogs } from "svelte-dialogs"; import { dialogs } from "svelte-dialogs";
import LoginDialog from "#components/LoginDialog.svelte"; import LoginDialog from "#components/LoginDialog.svelte";
import { API_ACCESS_TOKEN_COOKIE_NAME, PRICES } from "#lib/constants.js"; import {
API_ACCESS_TOKEN_COOKIE_NAME,
AusweisTyp,
PRICES,
} from "#lib/constants.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { import {
AufnahmeClient, AufnahmeClient,
@@ -21,12 +24,15 @@
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import { validateAccessTokenClient } from "src/client/lib/validateAccessToken.js"; import { validateAccessTokenClient } from "src/client/lib/validateAccessToken.js";
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import PaymentOption from "#components/PaymentOption.svelte";
export let user: BenutzerClient; export let user: BenutzerClient;
export let ausweis: VerbrauchsausweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient; export let objekt: ObjektClient;
export let ausweisart: Enums.Ausweisart; export let ausweisart: Enums.Ausweisart;
export let aktiveBezahlmethode: Bezahlmethoden = Enums.Bezahlmethoden.paypal;
export let ausweis_typ: AusweisTyp = AusweisTyp.Standard;
let rechnung: Partial<RechnungClient> = { let rechnung: Partial<RechnungClient> = {
email: user.email, email: user.email,
@@ -39,9 +45,14 @@
versand_plz: user.plz, versand_plz: user.plz,
versand_ort: user.ort, versand_ort: user.ort,
telefon: user.telefon, telefon: user.telefon,
} };
let services: { name: string, id: Enums.Service, price: number, selected: boolean }[] = [ let services: {
name: string;
id: Enums.Service;
price: number;
selected: boolean;
}[] = [
{ {
name: "Qualitätsdruck per Post (zusätzlich zur PDF Version)", name: "Qualitätsdruck per Post (zusätzlich zur PDF Version)",
id: Enums.Service.Qualitaetsdruck, id: Enums.Service.Qualitaetsdruck,
@@ -68,9 +79,6 @@
}, },
]; ];
export let bezahlmethode: Bezahlmethoden =
Enums.Bezahlmethoden.paypal;
let prices = PRICES[ausweisart]; let prices = PRICES[ausweisart];
let basePrice: number = prices[0]; let basePrice: number = prices[0];
@@ -83,14 +91,21 @@
); );
const zurueck = { const zurueck = {
[Enums.Ausweisart.VerbrauchsausweisWohnen]: `/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid=${ausweis.uid}`, [Enums.Ausweisart.VerbrauchsausweisWohnen]:
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: `/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`, `/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid=${ausweis.uid}`,
[Enums.Ausweisart.BedarfsausweisWohnen]: `/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`, [Enums.Ausweisart.VerbrauchsausweisGewerbe]:
[Enums.Ausweisart.BedarfsausweisGewerbe]: `/energieausweis-erstellen/bedarfsausweis-gewerbe?uid=${ausweis.uid}`, `/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisWohnen]: `/angebot-anfragen/geg-nachweis-wohnen-anfragen?uid=${ausweis.uid}`, [Enums.Ausweisart.BedarfsausweisWohnen]:
[Enums.Ausweisart.GEGNachweisGewerbe]: `/angebot-anfragen/geg-nachweis-gewerbe-anfragen?uid=${ausweis.uid}`, `/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisBedarfsausweis]: `/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?uid=${ausweis.uid}`, [Enums.Ausweisart.BedarfsausweisGewerbe]:
}[ausweisart] `/energieausweis-erstellen/bedarfsausweis-gewerbe?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisWohnen]:
`/angebot-anfragen/geg-nachweis-wohnen-anfragen?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisGewerbe]:
`/angebot-anfragen/geg-nachweis-gewerbe-anfragen?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisBedarfsausweis]:
`/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?uid=${ausweis.uid}`,
}[ausweisart];
async function speichern(e: SubmitEvent) { async function speichern(e: SubmitEvent) {
e.preventDefault(); e.preventDefault();
@@ -111,53 +126,58 @@
// uid: ausweis.uid, // uid: ausweis.uid,
// }); // });
localStorage.clear() localStorage.clear();
window.location.href = `/kaufabschluss?uid=${ausweis.uid}`; window.location.href = `/kaufabschluss?uid=${ausweis.uid}`;
} }
async function anfordern() { async function anfordern() {
// TODO Angebot anfordern // TODO Angebot anfordern
} }
async function bestellen() { async function bestellen() {
const ausweisart = getAusweisartFromUUID(ausweis.uid) as Enums.Ausweisart; const ausweisart = getAusweisartFromUUID(
ausweis.uid
) as Enums.Ausweisart;
try { try {
const { uid, checkout_url } = await api.rechnung.PUT.fetch({ const { uid, checkout_url } = await api.rechnung.PUT.fetch(
ausweisart, {
bezahlmethode, ausweisart,
services: services.filter(service => service.selected).map(service => service.id), bezahlmethode: aktiveBezahlmethode,
email: rechnung.email, services: services
empfaenger: rechnung.empfaenger, .filter((service) => service.selected)
strasse: rechnung.strasse, .map((service) => service.id),
plz: rechnung.plz, email: rechnung.email,
ort: rechnung.ort, empfaenger: rechnung.empfaenger,
versand_empfaenger: rechnung.versand_empfaenger, strasse: rechnung.strasse,
versand_strasse: rechnung.versand_strasse, plz: rechnung.plz,
versand_plz: rechnung.versand_plz, ort: rechnung.ort,
versand_ort: rechnung.versand_ort, versand_empfaenger: rechnung.versand_empfaenger,
telefon: rechnung.telefon, versand_strasse: rechnung.versand_strasse,
ausweis_uid: ausweis.uid versand_plz: rechnung.versand_plz,
}, { versand_ort: rechnung.versand_ort,
headers: { telefon: rechnung.telefon,
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` ausweis_uid: ausweis.uid,
ausweis_typ,
},
{
headers: {
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`,
},
} }
}) );
// Alle alten Ausweisdateien im localStorage löschen. // Alle alten Ausweisdateien im localStorage löschen.
localStorage.clear(); localStorage.clear();
if (bezahlmethode === Enums.Bezahlmethoden.rechnung) { if (aktiveBezahlmethode === Enums.Bezahlmethoden.rechnung) {
window.location.href = `/payment/success?r=${uid}&a=${ausweis.uid}` window.location.href = `/payment/success?r=${uid}&a=${ausweis.uid}`;
} else { } else {
window.location.href = checkout_url as string; window.location.href = checkout_url as string;
} }
} catch(e) { } catch (e) {}
}
} }
/** /**
* TODO * TODO
* Ausschlusskriterien: Neubau, Modernisierung * Ausschlusskriterien: Neubau, Modernisierung
@@ -169,11 +189,26 @@
Fehlende Angaben zum Sanierungsstand (Bei F mindestens 2 Haken), (Bei G mindestens 1 Haken) Fehlende Angaben zum Sanierungsstand (Bei F mindestens 2 Haken), (Bei G mindestens 1 Haken)
*/ */
let bestellenNichtMoeglich = false; 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)) { if (
bestellenNichtMoeglich = true ((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 = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) || (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) const gegAnfrage =
ausweisart === Enums.Ausweisart.GEGNachweisWohnen ||
ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis ||
ausweisart === Enums.Ausweisart.GEGNachweisGewerbe;
</script> </script>
<div <div
@@ -183,16 +218,19 @@ const gegAnfrage = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (auswe
2xl:grid-cols-2 2xl:gap-x-8 2xl:grid-cols-2 2xl:gap-x-8
" "
> >
{#if !gegAnfrage} {#if !gegAnfrage}
<div id="performance-box" class="w-full box relative px-4 order-1 self-stretch grid grid-cols-1"> <div
<PerformanceScore id="performance-box"
bind:ausweis class="w-full box relative px-4 order-1 self-stretch grid grid-cols-1"
bind:aufnahme={aufnahme} >
bind:objekt={objekt} <PerformanceScore
{ausweisart} bind:ausweis
/> bind:aufnahme
</div> bind:objekt
{/if} {ausweisart}
/>
</div>
{/if}
<div <div
id="progress-box" id="progress-box"
@@ -200,12 +238,16 @@ const gegAnfrage = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (auswe
> >
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1> <h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
<h2 class="text-primary text-xl"> <h2 class="text-primary text-xl">
{ausweisart} {prices[0]} {ausweisart}
{prices[0]}
</h2> </h2>
{#if gegAnfrage} {#if gegAnfrage}
<Progressbar active={1} steps={["Gebäudedaten", "Kundendaten", "Bestätigung"]}/> <Progressbar
active={1}
steps={["Gebäudedaten", "Kundendaten", "Bestätigung"]}
/>
{:else} {:else}
<Progressbar active={1}/> <Progressbar active={1} />
{/if} {/if}
</div> </div>
</div> </div>
@@ -224,72 +266,107 @@ const gegAnfrage = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (auswe
> >
{#if !gegAnfrage} {#if !gegAnfrage}
<Bereich bereich="3" title="Bezahlmethode"> <Bereich bereich="3" title="Bezahlmethode">
<Bezahlung bind:selectedPaymentType={bezahlmethode} /></Bereich <div
> id="bezahlung"
<div class="grid grid-cols-2 gap-x-6 my-6"> class="bereich-box grid
<div class="zusaetze bereich-box bg-white"> grid-cols-5 justify-around justify-items-center items-center"
<h3>Zusatzleistungen:</h3> >
<PaymentOption
bezahlmethode={Enums.Bezahlmethoden.paypal}
bind:aktiveBezahlmethode
name={"PayPal"}
icon={"/images/paypal.png"}
></PaymentOption>
<PaymentOption
bezahlmethode={Enums.Bezahlmethoden.sofort}
bind:aktiveBezahlmethode
name={"Sofort"}
icon={"/images/sofort.png"}
></PaymentOption>
<PaymentOption
bezahlmethode={Enums.Bezahlmethoden.giropay}
bind:aktiveBezahlmethode
name={"Giropay"}
icon={"/images/giropay.png"}
></PaymentOption>
<PaymentOption
bezahlmethode={Enums.Bezahlmethoden.creditcard}
bind:aktiveBezahlmethode
name={"Kreditkarte"}
icon={"/images/creditcard.png"}
></PaymentOption>
<PaymentOption
bezahlmethode={Enums.Bezahlmethoden.rechnung}
bind:aktiveBezahlmethode
name={"Rechnung"}
icon={"/images/rechnung.png"}
></PaymentOption>
</div></Bereich
>
<div class="grid grid-cols-2 gap-x-6 my-6">
<div class="zusaetze bereich-box bg-white">
<h3>Zusatzleistungen:</h3>
{#each services as service} {#each services as service}
<div class="zusatz"> <div class="zusatz">
<input <input
type="checkbox" type="checkbox"
bind:checked={service.selected} bind:checked={service.selected}
/>
<div class="text-right pr-6">
<b>{@html service.price}</b> inkl. Mwst
</div>
<div>{@html service.name}</div>
</div>
{/each}
</div>
<div class=" bereich-box bg-white ring-primary/50 ring-2">
<h3>Kosten:</h3>
<div class="ProduktKostenTabelle">
<div class="zeile betrag">
<div>Netto-Preis Energieausweis</div>
<div>:</div>
<div class="text-right">
<b>{(price * 0.81).toFixed(2) + " €"}</b>
</div>
</div>
<div class="zeile betrag">
<div>Zusatzleistung (Prüfung Mehraufwand)</div>
<div>:</div>
<div class="text-right"><b>0.00 €</b></div>
</div>
<div class="zeile betrag">
<div>19% gesetzl. MwSt.</div>
<div>:</div>
<div class="text-right">
<b>{(price * 0.19).toFixed(2) + " €"}</b>
</div>
</div>
<div class="zeile betrag mt-4">
<div><b>Preis inkl. MwSt.</b></div>
<div>:</div>
<div class="text-right">
<b>{price.toFixed(2) + " €"}</b>
</div>
</div>
<div class="zeile betrag mt-4 items-center">
<div><b>Bezahlmethode</b></div>
<div>:</div>
<div class="justify-self-end">
<img
src="images/{bezahlmethode}.png"
alt={bezahlmethode}
/> />
<div class="text-right pr-6">
<b>{@html service.price}</b> inkl. Mwst
</div>
<div>{@html service.name}</div>
</div>
{/each}
</div>
<div class=" bereich-box bg-white ring-primary/50 ring-2">
<h3>Kosten:</h3>
<div class="ProduktKostenTabelle">
<div class="zeile betrag">
<div>Netto-Preis Energieausweis</div>
<div>:</div>
<div class="text-right">
<b>{(price * 0.81).toFixed(2) + " €"}</b>
</div>
</div>
<div class="zeile betrag">
<div>Zusatzleistung (Prüfung Mehraufwand)</div>
<div>:</div>
<div class="text-right"><b>0.00 €</b></div>
</div>
<div class="zeile betrag">
<div>19% gesetzl. MwSt.</div>
<div>:</div>
<div class="text-right">
<b>{(price * 0.19).toFixed(2) + " €"}</b>
</div>
</div>
<div class="zeile betrag mt-4">
<div><b>Preis inkl. MwSt.</b></div>
<div>:</div>
<div class="text-right">
<b>{price.toFixed(2) + " €"}</b>
</div>
</div>
<div class="zeile betrag mt-4 items-center">
<div><b>Bezahlmethode</b></div>
<div>:</div>
<div class="justify-self-end">
<img
src="images/{aktiveBezahlmethode}.png"
alt={aktiveBezahlmethode}
/>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{/if} {/if}
<div <div
@@ -302,15 +379,23 @@ const gegAnfrage = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (auswe
<button class="button">Speichern</button> <button class="button">Speichern</button>
{#if gegAnfrage} {#if gegAnfrage}
<button class="button cursor-pointer" data-cy="bestellen" on:click={anfordern} >Angebot anfordern</button> <button
class="button cursor-pointer"
data-cy="bestellen"
on:click={anfordern}>Angebot anfordern</button
>
{:else} {:else}
<button class="button cursor-pointer" data-cy="bestellen" on:click={bestellen} >Kostenpflichtig bestellen</button> <button
class="button cursor-pointer"
data-cy="bestellen"
on:click={bestellen}>Kostenpflichtig bestellen</button
>
{/if} {/if}
</div> </div>
</div> </div>
</div> </div>
<!-- <!--
<div class="bereich-box pr-12 mt-6"> <div class="bereich-box pr-12 mt-6">
<Pruefung <Pruefung
bereich="A" bereich="A"
@@ -439,8 +524,7 @@ const gegAnfrage = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (auswe
</div> </div>
<ButtonZurueckSpeichernKaufabschluss bind:ausweis bind:aufnahme bind:objekt bind:bilder bind:user /> --> <ButtonZurueckSpeichernKaufabschluss bind:ausweis bind:aufnahme bind:objekt bind:bilder bind:user /> -->
<!-- <ButtonZurueckSpeichernKaufabschluss bind:ausweis bind:aufnahme bind:objekt bind:bilder bind:user /> --> <!-- <ButtonZurueckSpeichernKaufabschluss bind:ausweis bind:aufnahme bind:objekt bind:bilder bind:user /> -->
<style lang="postcss"> <style lang="postcss">
h3 { h3 {

View File

@@ -9,6 +9,7 @@ import {
} from "#lib/middleware/authorization.js"; } from "#lib/middleware/authorization.js";
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 { AusweisTyp, PRICES, SERVICES } from "#lib/constants.js";
export const PUT = defineApiRoute({ export const PUT = defineApiRoute({
meta: { meta: {
@@ -22,6 +23,7 @@ export const PUT = defineApiRoute({
.object({ .object({
ausweisart: z.nativeEnum(Enums.Ausweisart), ausweisart: z.nativeEnum(Enums.Ausweisart),
ausweis_uid: UUidWithPrefix, ausweis_uid: UUidWithPrefix,
ausweis_typ: z.nativeEnum(AusweisTyp)
}) })
.merge( .merge(
RechnungSchema.omit({ RechnungSchema.omit({
@@ -47,9 +49,13 @@ export const PUT = defineApiRoute({
// Wir erstellen eine Mollie Payment Referenz und eine neue Rechnung in unserer Datenbank, daraufhin geben // Wir erstellen eine Mollie Payment Referenz und eine neue Rechnung in unserer Datenbank, daraufhin geben
// wir eine Checkout URL zurück auf die der Nutzer weitergeleitet werden kann. // wir eine Checkout URL zurück auf die der Nutzer weitergeleitet werden kann.
const { ausweis_uid, ausweisart, bezahlmethode, services } = input; const { ausweis_uid, ausweisart, bezahlmethode, services, ausweis_typ } = input;
let betrag = PRICES[ausweisart][ausweis_typ]
// TODO: Services Implementieren const servicePriceList = SERVICES[ausweisart]
for (const service of input.services) {
betrag += servicePriceList[service]
}
const adapter = getPrismaAusweisAdapter(ausweis_uid); const adapter = getPrismaAusweisAdapter(ausweis_uid);
@@ -84,7 +90,7 @@ export const PUT = defineApiRoute({
const rechnung = await prisma.rechnung.create({ const rechnung = await prisma.rechnung.create({
data: { data: {
benutzer_id: user.id, benutzer_id: user.id,
betrag: 0, betrag,
bezahlmethode: bezahlmethode, bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open, status: Enums.Rechnungsstatus.open,
aufnahme_id: ausweis.aufnahme_id, aufnahme_id: ausweis.aufnahme_id,

View File

@@ -31,7 +31,7 @@ if (!adapter) {
return Astro.redirect("/") return Astro.redirect("/")
} }
const ausweis = adapter.findUnique({ const ausweis = await adapter.findUnique({
where: { where: {
uid: uidAusweis uid: uidAusweis
} }