From 1cc84716a15ffc61a888fdb4dee6ba8dbf718c0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20G=C3=BCnther?=
Date: Wed, 12 Aug 2026 16:55:44 +0200
Subject: [PATCH] UI improvements
---
.../Event/Controllers/SignupController.php | 24 +++++++++--
.../Views/Partials/SignUpForm/SignupForm.vue | 6 ++-
.../SignUpForm/composables/useSignupForm.js | 8 +++-
.../Partials/SignUpForm/steps/StepSummary.vue | 41 +++++++++++--------
4 files changed, 56 insertions(+), 23 deletions(-)
diff --git a/app/Domains/Event/Controllers/SignupController.php b/app/Domains/Event/Controllers/SignupController.php
index 7dbfefa..9de5ea7 100644
--- a/app/Domains/Event/Controllers/SignupController.php
+++ b/app/Domains/Event/Controllers/SignupController.php
@@ -12,6 +12,7 @@ use App\Providers\DoubleCheckEventRegistrationProvider;
use App\Providers\InertiaProvider;
use App\Resources\UserResource;
use App\Scopes\CommonController;
+use App\ValueObjects\Amount;
use DateTime;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -194,7 +195,7 @@ class SignupController extends CommonController {
$arrival = \DateTime::createFromFormat('Y-m-d', $request->input('arrival'));
$departure = \DateTime::createFromFormat('Y-m-d', $request->input('departure'));
- $amount = $event->calculateAmount(
+ $baseFee = $event->calculateAmount(
$request->input('participationType'),
$request->input('beitrag'),
$arrival,
@@ -205,12 +206,27 @@ class SignupController extends CommonController {
// Gewählte Zusätze immer einrechnen -- so enthält der finale Anzeigebetrag (und der Bestätigungstext)
// stets die Addons und der Zahlungsschritt wird nur bei Gesamt 0 € übersprungen.
$selectedAddonKeys = array_keys(array_filter((array)$request->input('addons', []), fn($v) => (bool)$v));
- $amount->addAmount($event->resolveAddons($selectedAddonKeys, $arrival, $departure)['total']);
+ $resolution = $event->resolveAddons($selectedAddonKeys, $arrival, $departure);
+
+ // Gesamt = Teilnahmebeitrag + Zusätze; Basisbetrag separat für die Kostenübersicht in der Zusammenfassung.
+ $total = new Amount($baseFee->getAmount(), 'Euro');
+ $total->addAmount($resolution['total']);
+
+ $addonLines = array_map(fn($item) => [
+ 'key' => $item['key'],
+ 'title' => $item['title'],
+ 'amountValue' => $item['amount'],
+ 'amount' => new Amount($item['amount'], 'Euro')->toString(),
+ 'free' => $item['amount'] <= 0,
+ ], $resolution['items']);
// amountValue (numerisch) steuert im Frontend das Überspringen des Zahlungsart-Schritts bei 0 €.
return response()->json([
- 'amount' => $amount->toString(),
- 'amountValue' => $amount->getAmount(),
+ 'amount' => $total->toString(),
+ 'amountValue' => $total->getAmount(),
+ 'baseAmount' => $baseFee->toString(),
+ 'baseAmountValue' => $baseFee->getAmount(),
+ 'addons' => $addonLines,
]);
}
}
diff --git a/app/Domains/Event/Views/Partials/SignUpForm/SignupForm.vue b/app/Domains/Event/Views/Partials/SignUpForm/SignupForm.vue
index 80f4165..63f5f4c 100644
--- a/app/Domains/Event/Views/Partials/SignUpForm/SignupForm.vue
+++ b/app/Domains/Event/Views/Partials/SignUpForm/SignupForm.vue
@@ -24,7 +24,8 @@ const emit = defineEmits(['registrationDone'])
const {
currentStep, goToStep, formData, selectedAddons,
- submit, submitting, submitResult, summaryLoading, summaryAmount, summaryAmountValue
+ submit, submitting, submitResult, summaryLoading, summaryAmount, summaryAmountValue,
+ summaryBaseAmount, summaryAddonLines
} = useSignupForm(props.event, props.participantData)
const steps = [
@@ -107,7 +108,8 @@ const steps = [
v-if="currentStep === 11"
:formData="formData"
:event="event"
- :selectedAddons="selectedAddons"
+ :summaryBaseAmount="summaryBaseAmount"
+ :summaryAddonLines="summaryAddonLines"
:summaryAmount="summaryAmount"
:summaryAmountValue="summaryAmountValue"
:summaryLoading="summaryLoading"
diff --git a/app/Domains/Event/Views/Partials/SignUpForm/composables/useSignupForm.js b/app/Domains/Event/Views/Partials/SignUpForm/composables/useSignupForm.js
index 7a0a709..a68615b 100644
--- a/app/Domains/Event/Views/Partials/SignUpForm/composables/useSignupForm.js
+++ b/app/Domains/Event/Views/Partials/SignUpForm/composables/useSignupForm.js
@@ -60,6 +60,8 @@ export function useSignupForm(event, participantData) {
const summaryAmount = ref('')
const summaryAmountValue = ref(0)
+ const summaryBaseAmount = ref('')
+ const summaryAddonLines = ref([])
const fetchAmount = async () => {
summaryLoading.value = true
@@ -77,6 +79,8 @@ export function useSignupForm(event, participantData) {
})
summaryAmount.value = res.data.amount
summaryAmountValue.value = Number(res.data.amountValue ?? 0)
+ summaryBaseAmount.value = res.data.baseAmount ?? ''
+ summaryAddonLines.value = res.data.addons ?? []
} finally {
summaryLoading.value = false
}
@@ -128,6 +132,8 @@ export function useSignupForm(event, participantData) {
submitResult,
summaryLoading,
summaryAmount,
- summaryAmountValue
+ summaryAmountValue,
+ summaryBaseAmount,
+ summaryAddonLines
}
}
diff --git a/app/Domains/Event/Views/Partials/SignUpForm/steps/StepSummary.vue b/app/Domains/Event/Views/Partials/SignUpForm/steps/StepSummary.vue
index e5c985e..ed6f5f3 100644
--- a/app/Domains/Event/Views/Partials/SignUpForm/steps/StepSummary.vue
+++ b/app/Domains/Event/Views/Partials/SignUpForm/steps/StepSummary.vue
@@ -7,7 +7,8 @@ const PAYMENT_ACCOUNT_TRANSACTION = 'PAYMENT_ACCOUNT_TRANSACTION'
const props = defineProps({
formData: Object,
event: Object,
- selectedAddons: {type: Object, default: () => ({})},
+ summaryBaseAmount: {type: String, default: ''},
+ summaryAddonLines: {type: Array, default: () => []},
summaryAmount: String,
summaryAmountValue: {type: Number, default: 0},
summaryLoading: Boolean,
@@ -36,16 +37,6 @@ const paymentConfirmationText = computed(() => {
// Zurück führt zur Zahlungsart (10), sofern dieser Schritt gezeigt wurde; bei 0 € direkt zu Allergien (9).
const backTarget = computed(() => props.summaryAmountValue > 0 ? 10 : 9)
-// Gewählte Zusätze (Event-Addons) für die Zusammenfassung mit Preisanzeige.
-const selectedAddonList = computed(() =>
- (props.event.addons ?? [])
- .filter(addon => props.selectedAddons[addon.key])
- .map(addon => ({
- title: addon.title,
- price: addon.free ? 'Kostenfrei' : (addon.priceReadable + (addon.flat ? '' : ' / Tag')),
- }))
-)
-
// Gewählte Teilnahmeoptionen für die Zusammenfassung (label statt value anzeigen).
const selectedParticipationOptions = computed(() =>
(props.event.participationOptions ?? []).map(question => {
@@ -140,11 +131,6 @@ function eatingHabit() {
{{ option.value }} |
-
- | {{ addon.title }}: |
- {{ addon.price }} |
-
-
| Foto-Erlaubnis: |
@@ -179,6 +165,22 @@ function eatingHabit() {
|
| Abreise: | {{ formatDate(formData.departure) }} |
+ Kostenübersicht
+
+
+
+