Kundendaten Rechnung Typ Aktualisiert
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
---
|
||||
import { validateAccessTokenServer } from "#lib/validateAccessToken"
|
||||
import { validateAccessTokenServer } from "#lib/server/validateAccessToken";
|
||||
|
||||
const valid = await validateAccessTokenServer(Astro)
|
||||
---
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
export let selectedPaymentType: Bezahlmethoden;
|
||||
</script>
|
||||
|
||||
<button class="flex flex-col items-center cursor-pointer" class:bg-gray-100={paymentType == selectedPaymentType} on:click={() => selectedPaymentType = paymentType}>
|
||||
<button type="button" class="flex flex-col items-center cursor-pointer" class:bg-gray-100={paymentType == selectedPaymentType} on:click={() => selectedPaymentType = paymentType}>
|
||||
<img src={icon} alt={name} />
|
||||
<span aria-label={name}>
|
||||
{name}
|
||||
|
||||
42
src/lib/server/validateAccessToken.ts
Normal file
42
src/lib/server/validateAccessToken.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { createCaller } from "#lib/caller";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import type { AstroGlobal } from "astro";
|
||||
import moment from "moment";
|
||||
|
||||
|
||||
export async function validateAccessTokenServer(astro: Readonly<AstroGlobal<Record<string, any>>>) {
|
||||
const accessToken = astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME).value;
|
||||
const refreshToken = astro.cookies.get(API_REFRESH_TOKEN_COOKIE_NAME).value;
|
||||
|
||||
if (accessToken) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen.
|
||||
// Schauen wir mal, ob wir einen Refresh Token haben.
|
||||
|
||||
if (!refreshToken) {
|
||||
// Wir haben keinen Refresh Token, also müssen wir uns neu anmelden.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Wir haben einen Refresh Token, also versuchen wir uns damit anzumelden.
|
||||
// Wenn das klappt, dann haben wir auch einen neuen Access Token.
|
||||
// Wenn das nicht klappt, dann müssen wir uns neu anmelden.
|
||||
try {
|
||||
const { accessToken: newAccessToken, exp } = await createCaller(astro).v1.benutzer.getAccessToken({
|
||||
refreshToken
|
||||
})
|
||||
|
||||
astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, {
|
||||
domain: `.${astro.url.host}`,
|
||||
path: "/",
|
||||
expires: moment.unix(exp).toDate()
|
||||
});
|
||||
return true;
|
||||
} catch (e) {
|
||||
astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
astro.cookies.delete(API_REFRESH_TOKEN_COOKIE_NAME);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
import Cookies from "js-cookie";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "./constants";
|
||||
import { client } from "src/trpc";
|
||||
import { AstroCookies, AstroGlobal } from "astro";
|
||||
import { createCaller } from "./caller";
|
||||
|
||||
export async function validateAccessTokenServer(astro: Readonly<AstroGlobal<Record<string, any>>>) {
|
||||
const accessToken = astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME).value;
|
||||
const refreshToken = astro.cookies.get(API_REFRESH_TOKEN_COOKIE_NAME).value;
|
||||
|
||||
if (accessToken) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen.
|
||||
// Schauen wir mal, ob wir einen Refresh Token haben.
|
||||
|
||||
if (!refreshToken) {
|
||||
// Wir haben keinen Refresh Token, also müssen wir uns neu anmelden.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Wir haben einen Refresh Token, also versuchen wir uns damit anzumelden.
|
||||
// Wenn das klappt, dann haben wir auch einen neuen Access Token.
|
||||
// Wenn das nicht klappt, dann müssen wir uns neu anmelden.
|
||||
try {
|
||||
const { accessToken: newAccessToken, exp } = await createCaller(astro).v1.benutzer.getAccessToken.query({
|
||||
refreshToken
|
||||
})
|
||||
|
||||
const options = {
|
||||
domain: `.${window.location.hostname}`,
|
||||
path: "/",
|
||||
expires: exp
|
||||
}
|
||||
|
||||
astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, options);
|
||||
return true;
|
||||
} catch (e) {
|
||||
astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
astro.cookies.delete(API_REFRESH_TOKEN_COOKIE_NAME);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export async function validateAccessTokenClient() {
|
||||
const accessToken = Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
const refreshToken = Cookies.get(API_REFRESH_TOKEN_COOKIE_NAME);
|
||||
|
||||
if (accessToken) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen.
|
||||
// Schauen wir mal, ob wir einen Refresh Token haben.
|
||||
|
||||
if (!refreshToken) {
|
||||
// Wir haben keinen Refresh Token, also müssen wir uns neu anmelden.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Wir haben einen Refresh Token, also versuchen wir uns damit anzumelden.
|
||||
// Wenn das klappt, dann haben wir auch einen neuen Access Token.
|
||||
// Wenn das nicht klappt, dann müssen wir uns neu anmelden.
|
||||
try {
|
||||
const { accessToken: newAccessToken, exp } = await client.v1.benutzer.getAccessToken.query({
|
||||
refreshToken
|
||||
})
|
||||
|
||||
const options = {
|
||||
domain: `.${window.location.hostname}`,
|
||||
path: "/",
|
||||
expires: exp
|
||||
}
|
||||
|
||||
Cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, options);
|
||||
return true;
|
||||
} catch (e) {
|
||||
Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
Cookies.remove(API_REFRESH_TOKEN_COOKIE_NAME);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
43
src/lib/validateAccessTokenServer.ts
Normal file
43
src/lib/validateAccessTokenServer.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import Cookies from "js-cookie";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "./constants";
|
||||
import { client } from "src/trpc";
|
||||
|
||||
|
||||
export async function validateAccessTokenClient() {
|
||||
const accessToken = Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
const refreshToken = Cookies.get(API_REFRESH_TOKEN_COOKIE_NAME);
|
||||
|
||||
if (accessToken) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen.
|
||||
// Schauen wir mal, ob wir einen Refresh Token haben.
|
||||
|
||||
if (!refreshToken) {
|
||||
// Wir haben keinen Refresh Token, also müssen wir uns neu anmelden.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Wir haben einen Refresh Token, also versuchen wir uns damit anzumelden.
|
||||
// Wenn das klappt, dann haben wir auch einen neuen Access Token.
|
||||
// Wenn das nicht klappt, dann müssen wir uns neu anmelden.
|
||||
try {
|
||||
const { accessToken: newAccessToken, exp } = await client.v1.benutzer.getAccessToken.query({
|
||||
refreshToken
|
||||
})
|
||||
|
||||
const options = {
|
||||
domain: `.${window.location.hostname}`,
|
||||
path: "/",
|
||||
expires: exp
|
||||
}
|
||||
|
||||
Cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, options);
|
||||
return true;
|
||||
} catch (e) {
|
||||
Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
Cookies.remove(API_REFRESH_TOKEN_COOKIE_NAME);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -20,16 +20,15 @@
|
||||
import Overlay from "#components/Overlay.svelte";
|
||||
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
|
||||
import AusweisGespeichertModule from "./AusweisGespeichertModule.svelte";
|
||||
import { validateAccessTokenClient } from "#lib/validateAccessToken";
|
||||
|
||||
import { validateAccessTokenClient } from "#lib/validateAccessTokenServer";
|
||||
|
||||
export let uid: string | null = null;
|
||||
export let gebaeude: GebaeudeStammdaten = {} as GebaeudeStammdaten;
|
||||
export let ausweis: VerbrauchsausweisWohnen = {
|
||||
ausweisart: Enums.Ausweisart.VerbrauchsausweisWohnen
|
||||
} as VerbrauchsausweisWohnen;
|
||||
|
||||
async function spaeterWeitermachen() {
|
||||
|
||||
async function ausweisSpeichern() {
|
||||
// Um einen Ausweis zu speichern müssen wir eingeloggt sein, andernfalls wird die API den call ablehnen.
|
||||
// Wir prüfen also ob wir eingeloggt sind und leiten den Nutzer ggf. auf die Login Seite weiter.
|
||||
if (!await validateAccessTokenClient()) {
|
||||
@@ -49,8 +48,7 @@
|
||||
uid
|
||||
})
|
||||
|
||||
speichernOverlayHidden = false;
|
||||
window.history.pushState({}, "", `/verbrauchsausweis?uid=${uid}`);
|
||||
return true;
|
||||
} catch (e) {
|
||||
addNotification({
|
||||
dismissable: false,
|
||||
@@ -59,6 +57,7 @@
|
||||
timeout: 6000,
|
||||
type: "error"
|
||||
})
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
// Wir speichern den Ausweis ab und leiten auf die "ausweis-gespeichert" Seite weiter.
|
||||
@@ -68,8 +67,7 @@
|
||||
gebaeude
|
||||
})
|
||||
uid = response.uid
|
||||
window.history.pushState({}, "", `/verbrauchsausweis?uid=${uid}`);
|
||||
speichernOverlayHidden = false;
|
||||
return true;
|
||||
} catch (e) {
|
||||
addNotification({
|
||||
dismissable: false,
|
||||
@@ -78,11 +76,19 @@
|
||||
timeout: 6000,
|
||||
type: "error"
|
||||
})
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(gebaeude, ausweis)
|
||||
async function spaeterWeitermachen() {
|
||||
const result = await ausweisSpeichern();
|
||||
|
||||
if (result === true) {
|
||||
window.history.pushState({}, "", `/verbrauchsausweis?uid=${uid}`);
|
||||
speichernOverlayHidden = false;
|
||||
}
|
||||
}
|
||||
|
||||
function automatischAusfüllen() {
|
||||
gebaeude.baujahr_gebaeude = [1962];
|
||||
@@ -110,13 +116,11 @@
|
||||
|
||||
|
||||
async function ausweisAbschicken() {
|
||||
waitOverlayHidden = false;
|
||||
const response = await client.v1.verbrauchsausweisWohnen[2016].erstellen.mutate({
|
||||
...ausweis,
|
||||
gebaeude_stammdaten: gebaeude
|
||||
})
|
||||
const result = await ausweisSpeichern();
|
||||
|
||||
window.location.href = `/kundendaten?uid=${response.uid}`;
|
||||
if (result === true) {
|
||||
window.location.href = `/kundendaten?uid=${uid}`;
|
||||
}
|
||||
}
|
||||
|
||||
let waitOverlayHidden = true;
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
import { Enums } from "@ibcornelsen/database/client"
|
||||
import PaymentOption from "#components/PaymentOption.svelte";
|
||||
import { client } from "src/trpc";
|
||||
import type { inferProcedureInput } from "@trpc/server";
|
||||
import type { AppRouter } from "@ibcornelsen/api";
|
||||
|
||||
export let user: Benutzer;
|
||||
export let ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe;
|
||||
let rechnung: Rechnungen = {} as Rechnungen;
|
||||
let rechnung: inferProcedureInput<AppRouter["v1"]["rechnungen"]["erstellen"]> = {};
|
||||
|
||||
let services = [{
|
||||
name: "Qualitätsdruck per Post (zusätzlich zur PDF Version) für 9€ inkl. MwSt.",
|
||||
@@ -40,16 +42,25 @@
|
||||
let agbAkzeptiert: boolean;
|
||||
let datenschutzAkzeptiert: boolean;
|
||||
|
||||
async function createPayment() {
|
||||
async function createPayment(e: SubmitEvent) {
|
||||
e.preventDefault()
|
||||
if (form.checkValidity() === false) {
|
||||
form.reportValidity();
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await client.v1.rechnungen.erstellen.mutate({
|
||||
...rechnung,
|
||||
ausweisart: ausweis.ausweisart,
|
||||
uid: ausweis.uid,
|
||||
payment_method: selectedPaymentType,
|
||||
bezahlmethode: selectedPaymentType,
|
||||
services: services.filter(service => service.selected).map(service => service.id)
|
||||
})
|
||||
|
||||
window.location.href = response.checkout_url
|
||||
//window.location.href = response.checkout_url
|
||||
}
|
||||
|
||||
let form: HTMLFormElement;
|
||||
</script>
|
||||
|
||||
<div class="w-full px-8">
|
||||
@@ -63,7 +74,7 @@
|
||||
<div
|
||||
class="w-full"
|
||||
>
|
||||
<div class="flex flex-row gap-8">
|
||||
<form class="flex flex-row gap-8" bind:this={form}>
|
||||
<div class="w-3/5">
|
||||
<div class="GRB3">
|
||||
<HelpLabel title="Ansprechpartner" />
|
||||
@@ -337,7 +348,7 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<button class="pay-button" disabled={!agbAkzeptiert || !datenschutzAkzeptiert}
|
||||
<button type="submit" class="pay-button" disabled={!agbAkzeptiert || !datenschutzAkzeptiert}
|
||||
on:click={createPayment}
|
||||
>Kostenpflichtig Bestellen</button
|
||||
>
|
||||
@@ -353,7 +364,7 @@
|
||||
<div class="w-2/5">
|
||||
<PriceContainer {ausweis} bind:services />
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
import LoginModule from "../modules/LoginModule.svelte";
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
import { validateAccessTokenServer } from "#lib/validateAccessToken";
|
||||
import { validateAccessTokenServer } from "#lib/server/validateAccessToken";
|
||||
|
||||
const valid = await validateAccessTokenServer(Astro)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user