Kundendaten Rechnung Typ Aktualisiert

This commit is contained in:
Moritz Utcke
2024-01-13 14:03:24 +07:00
parent 97bc8bedbb
commit 5809cfc0ef
8 changed files with 125 additions and 108 deletions

View File

@@ -1,5 +1,5 @@
---
import { validateAccessTokenServer } from "#lib/validateAccessToken"
import { validateAccessTokenServer } from "#lib/server/validateAccessToken";
const valid = await validateAccessTokenServer(Astro)
---

View File

@@ -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}

View 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;
}
}

View File

@@ -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;
}
}

View 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;
}
}

View File

@@ -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;

View File

@@ -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>

View File

@@ -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)