Anschrift für Veranstaltungsort

This commit is contained in:
2026-09-10 11:45:52 +02:00
parent 70a57d10f5
commit ddfaab1501
19 changed files with 306 additions and 10 deletions
@@ -33,7 +33,7 @@ function navigateTo(url) {
</tr>
<tr>
<td>
{{participation.event.postal_code}} {{participation.event.location}}<br />
{{participation.eventAddress}}<br />
</td>
<td>
<a class="link" :href="`/api/v1/event/participant/${participation.identifier}/ical`">In Kalender importieren</a>
@@ -38,6 +38,8 @@ class CreateEventCommand {
'name' => $this->request->name,
'identifier' => Str::random(10),
'location' => $this->request->location,
'street' => $this->normalizeOptional($this->request->street),
'house_number' => $this->normalizeOptional($this->request->houseNumber),
'postal_code' => $this->request->postalCode,
'email' => $this->request->email,
'start_date' => $this->request->begin,
@@ -107,6 +109,17 @@ class CreateEventCommand {
return $response;
}
/**
* Straße und Hausnummer sind optional. Ein leer gelassenes Eingabefeld liefert einen leeren String --
* gespeichert wird dafür `null`, damit „nicht angegeben" nur eine Darstellung hat.
*/
private function normalizeOptional(?string $value): ?string
{
$value = trim((string) $value);
return '' === $value ? null : $value;
}
/**
* Event-Teil der Rechnungsnummer, z.B. `WM-V-20260701`: Tenant-Präfix, Dokumentart „V" für
* Veranstaltung, dann ohne Trenner Jahr, Monat des Beginns und die laufende Nummer der
@@ -19,8 +19,10 @@ class CreateEventRequest {
public string $accountOwner;
public string $accountIban;
public bool $payPerDay;
public ?string $street;
public ?string $houseNumber;
public function __construct(string $name, string $location, string $postalCode, string $email, DateTime $begin, DateTime $end, DateTime $earlyBirdEnd, DateTime $registrationFinalEnd, int $earlyBirdEndAmountIncrease, ParticipationFeeType $participationFeeType, string $accountOwner, string $accountIban, bool $payPerDay) {
public function __construct(string $name, string $location, string $postalCode, string $email, DateTime $begin, DateTime $end, DateTime $earlyBirdEnd, DateTime $registrationFinalEnd, int $earlyBirdEndAmountIncrease, ParticipationFeeType $participationFeeType, string $accountOwner, string $accountIban, bool $payPerDay, ?string $street = null, ?string $houseNumber = null) {
$this->name = $name;
$this->location = $location;
$this->postalCode = $postalCode;
@@ -34,5 +36,7 @@ class CreateEventRequest {
$this->accountOwner = $accountOwner;
$this->accountIban = $accountIban;
$this->payPerDay = $payPerDay;
$this->street = $street;
$this->houseNumber = $houseNumber;
}
}
@@ -18,7 +18,7 @@ class GenerateIcalCommand
$dtEnd = $event->end_date->copy()->addDay()->format('Ymd');
$now = now()->format('Ymd\THis\Z');
$summary = $this->escapeIcal($event->name);
$location = $this->escapeIcal(trim($event->postal_code . ' ' . $event->location));
$location = $this->escapeIcal($event->getFullAddress());
$description = $this->escapeIcal('Teilnahme als: ' . $participant->getOfficialName());
$icalContent = implode("\r\n", [
@@ -13,6 +13,8 @@ class UpdateEventCommand {
$this->request->event->name = $this->request->eventName;
$this->request->event->location = $this->request->eventLocation;
$this->request->event->street = $this->normalizeOptional($this->request->street);
$this->request->event->house_number = $this->normalizeOptional($this->request->houseNumber);
$this->request->event->postal_code = $this->request->postalCode;
$this->request->event->email = $this->request->email;
$this->request->event->early_bird_end = $this->request->earlyBirdEnd;
@@ -42,4 +44,15 @@ class UpdateEventCommand {
return $response;
}
/**
* Straße und Hausnummer sind optional. Ein geleertes Eingabefeld liefert einen leeren String --
* gespeichert wird dafür `null`, damit „nicht angegeben" nur eine Darstellung hat.
*/
private function normalizeOptional(?string $value): ?string
{
$value = trim((string) $value);
return '' === $value ? null : $value;
}
}
@@ -10,6 +10,8 @@ class UpdateEventRequest {
public Event $event;
public string $eventName;
public string $eventLocation;
public ?string $street;
public ?string $houseNumber;
public string $postalCode;
public string $email;
public DateTime $earlyBirdEnd;
@@ -24,11 +26,13 @@ class UpdateEventRequest {
public array $contributingLocalGroups;
public array $eatingHabits;
public function __construct(Event $event, string $eventName, string $eventLocation, string $postalCode, string $email, DateTime $earlyBirdEnd, DateTime $registrationFinalEnd, int $alcoholicsAge, bool $sendWeeklyReports, bool $registrationAllowed, Amount $flatSupport, Amount $supportPerPerson, array $contributingLocalGroups, array $eatingHabits, bool $shortRegistration = false, bool $swimmingPermissionRequired = true)
public function __construct(Event $event, string $eventName, string $eventLocation, string $postalCode, string $email, DateTime $earlyBirdEnd, DateTime $registrationFinalEnd, int $alcoholicsAge, bool $sendWeeklyReports, bool $registrationAllowed, Amount $flatSupport, Amount $supportPerPerson, array $contributingLocalGroups, array $eatingHabits, bool $shortRegistration = false, bool $swimmingPermissionRequired = true, ?string $street = null, ?string $houseNumber = null)
{
$this->event = $event;
$this->eventName = $eventName;
$this->eventLocation = $eventLocation;
$this->street = $street;
$this->houseNumber = $houseNumber;
$this->postalCode = $postalCode;
$this->email = $email;
$this->earlyBirdEnd = $earlyBirdEnd;
@@ -17,6 +17,7 @@ class ArchivedEventsController extends CommonController
'name' => $event->name,
'location' => $event->location,
'postalCode' => $event->postal_code,
'fullAddress' => $event->getFullAddress(),
'eventBegin' => $event->start_date->format('d.m.Y'),
'eventEnd' => $event->end_date->format('d.m.Y'),
];
@@ -56,7 +56,9 @@ class CreateController extends CommonController {
$participationFeeType,
$request->input('eventAccount'),
$request->input('eventIban'),
$payPerDay
$payPerDay,
$request->input('eventStreet'),
$request->input('eventHouseNumber')
);
$wasSuccessful = false;
@@ -63,6 +63,8 @@ class DetailsController extends CommonController {
$eatingHabits,
(bool)$request->input('shortRegistration', false),
(bool)$request->input('swimmingPermissionRequired', true),
$request->input('street'),
$request->input('houseNumber'),
);
$eventUpdateCommand = new UpdateEventCommand($eventUpdateRequest);
+1 -1
View File
@@ -47,7 +47,7 @@ async function unarchiveEvent(eventId) {
<div>
<h2 style="margin: 0 0 4px 0; font-size: 1.1rem; font-weight: 600;">{{ event.name }}</h2>
<span style="color: #6b7280; font-size: 0.875rem;">
{{ event.postalCode }} {{ event.location }}
{{ event.fullAddress }}
&nbsp;·&nbsp;
{{ event.eventBegin }} {{ event.eventEnd }}
</span>
+14
View File
@@ -23,6 +23,8 @@
eventName: '',
eventPostalCode: '',
eventLocation: '',
eventStreet: '',
eventHouseNumber: '',
eventEmail: props.emailAddress ? props.emailAddress : '',
eventBegin: '',
eventEnd: '',
@@ -145,6 +147,8 @@
eventName: formData.eventName,
eventPostalCode: formData.eventPostalCode,
eventLocation: formData.eventLocation,
eventStreet: formData.eventStreet,
eventHouseNumber: formData.eventHouseNumber,
eventEmail: formData.eventEmail,
eventBegin: formData.eventBegin,
eventEnd: formData.eventEnd,
@@ -195,6 +199,16 @@
<ErrorText :message="errors.eventLocation" /></td>
</tr>
<tr style="vertical-align: top;">
<th class="width-medium pr-20 height-50">Straße (optional)</th>
<td class="height-50"><input type="text" v-model="formData.eventStreet" class="width-half-full" /></td>
</tr>
<tr style="vertical-align: top;">
<th class="width-medium pr-20 height-50">Hausnummer (optional)</th>
<td class="height-50"><input type="text" v-model="formData.eventHouseNumber" class="width-half-full" /></td>
</tr>
<tr style="vertical-align: top;">
<th class="width-medium pr-20 height-50">Postleitzahl des Veranstaltungsorts</th>
<td class="height-50"><input type="text" v-model="formData.eventPostalCode" class="width-half-full" />
@@ -22,7 +22,7 @@ const props = defineProps({
<div class="available-event-header">
<div>
<h2 class="available-event-title">{{ event.name }}</h2>
<span class="available-event-location">{{ event.postalCode }} {{ event.location }}</span>
<span class="available-event-location">{{ event.fullAddress }}</span>
</div>
<span
v-if="event.registrationAllowed"
@@ -47,7 +47,7 @@ const props = defineProps({
</tr>
<tr>
<th>Veranstaltungsort</th>
<td>{{ event.postalCode }} {{ event.location }}</td>
<td>{{ event.fullAddress }}</td>
</tr>
<tr>
<th>Frühbuchen bis</th>
@@ -27,6 +27,8 @@ const emit = defineEmits(['close'])
contributingLocalGroups: contributingLocalGroups.value,
eventName: props.event.name,
eventLocation: props.event.location,
street: props.event.street ?? '',
houseNumber: props.event.houseNumber ?? '',
postalCode: props.event.postalCode,
email: props.event.email,
earlyBirdEnd: props.event.earlyBirdEnd.internal,
@@ -59,6 +61,8 @@ const emit = defineEmits(['close'])
body: {
eventName: formData.eventName,
eventLocation: formData.eventLocation,
street: formData.street,
houseNumber: formData.houseNumber,
postalCode: formData.postalCode,
email: formData.email,
earlyBirdEnd: formData.earlyBirdEnd,
@@ -109,6 +113,20 @@ const emit = defineEmits(['close'])
</td>
</tr>
<tr>
<th>Straße (optional)</th>
<td>
<input type="text" v-model="formData.street" class="width-full" />
</td>
</tr>
<tr>
<th>Hausnummer (optional)</th>
<td>
<input type="text" v-model="formData.houseNumber" class="width-full" />
</td>
</tr>
<tr>
<th>Postleitzahl des Veranstaltungsorts</th>
<td>
+2 -2
View File
@@ -38,7 +38,7 @@ function close() {
</span>
</div>
<p class="signup-event-location">
📍 {{ props.event.postalCode }} {{ props.event.location }}
📍 {{ props.event.fullAddress }}
</p>
</div>
<div v-else class="signup-header signup-header--closed">
@@ -49,7 +49,7 @@ function close() {
</span>
</div>
<p class="signup-event-location">
📍 {{ props.event.postalCode }} {{ props.event.location }}
📍 {{ props.event.fullAddress }}
</p>
</div>