143 lines
5.9 KiB
PHP
143 lines
5.9 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Event\Actions\ShortSignUp;
|
|
|
|
use App\Domains\Event\Actions\SignUp\SignUpCommand;
|
|
use App\Domains\Event\Actions\SignUp\SignUpRequest;
|
|
use App\ValueObjects\Age;
|
|
|
|
/**
|
|
* Verkürzte Anmeldung: ergänzt die nicht erhobenen Pflichtangaben um Platzhalter und übergibt an die reguläre
|
|
* Anmelde-Action. Dadurch gelten für Kurzanmeldungen dieselben Regeln wie für jede andere Anmeldung
|
|
* (Transaktion, laufende Rechnungsnummer, eFZ-Vorbelegung, Snapshot der Teilnahmeoptionen).
|
|
*/
|
|
class ShortSignUpCommand {
|
|
/** Platzhalter für Angaben, die die Kurzanmeldung nicht erhebt. */
|
|
private const string PLACEHOLDER = 'Nicht erforderlich';
|
|
|
|
/**
|
|
* Die Postleitzahl bekommt bewusst keinen Text-Platzhalter: aus ihr wird in Teilnehmerliste und CSV-Export
|
|
* das Bundesland abgeleitet.
|
|
*/
|
|
private const string PLACEHOLDER_POSTCODE = '00000';
|
|
|
|
public function __construct(public ShortSignUpRequest $request) {
|
|
}
|
|
|
|
public function execute() : ShortSignUpResponse {
|
|
$response = new ShortSignUpResponse();
|
|
|
|
// Ohne konfigurierte Teilnahmegruppe gäbe es keinen gültigen `participation_type` -- sauber abbrechen,
|
|
// statt in einen Fremdschlüssel-Fehler zu laufen.
|
|
$participationType = $this->request->event->firstParticipationTypeSlug();
|
|
if ($participationType === null) {
|
|
$response->message = 'Für diese Veranstaltung ist noch keine Teilnahmegruppe hinterlegt.';
|
|
return $response;
|
|
}
|
|
|
|
$participantAge = new Age($this->request->birthday);
|
|
|
|
// Bei Minderjährigen ist die Kontaktperson Pflicht; der Client prüft das ebenfalls, verlassen wird sich
|
|
// darauf nicht.
|
|
if (!$participantAge->isfullAged()
|
|
&& ($this->request->contactPerson === null || $this->request->contactEmail === null)) {
|
|
$response->message = 'Für Minderjährige werden Name und E-Mail-Adresse einer Kontaktperson benötigt.';
|
|
return $response;
|
|
}
|
|
|
|
// Stamm: bei genau einem teilnehmenden Stamm wird dieser gesetzt, bei mehreren muss gewählt werden,
|
|
// ohne teilnehmende Stämme bleibt die Zuordnung leer.
|
|
$localGroups = $this->request->event->localGroups;
|
|
$localGroup = null;
|
|
|
|
if ($localGroups->count() === 1) {
|
|
$localGroup = $localGroups->first();
|
|
} elseif ($localGroups->count() > 1) {
|
|
$localGroup = $localGroups->firstWhere('id', $this->request->localGroupId);
|
|
|
|
if ($localGroup === null) {
|
|
$response->message = 'Bitte einen Stamm auswählen.';
|
|
return $response;
|
|
}
|
|
}
|
|
|
|
$eventResource = $this->request->event->toResource();
|
|
|
|
// Zeitraum, Gruppe und Beitragsstufe stehen bei der Kurzanmeldung fest -- es gibt nichts zu wählen.
|
|
$amount = $eventResource->calculateAmount(
|
|
$participationType,
|
|
'standard',
|
|
$this->request->event->start_date,
|
|
$this->request->event->end_date,
|
|
false
|
|
);
|
|
|
|
$signUpRequest = new SignUpRequest(
|
|
event: $this->request->event,
|
|
user_id: $this->request->user_id,
|
|
firstname: $this->request->firstname,
|
|
lastname: $this->request->lastname,
|
|
nickname: $this->request->nickname,
|
|
participationType: $participationType,
|
|
localGroup: $localGroup,
|
|
birthday: $this->request->birthday,
|
|
address_1: self::PLACEHOLDER,
|
|
address_2: null,
|
|
postcode: self::PLACEHOLDER_POSTCODE,
|
|
city: self::PLACEHOLDER,
|
|
email_1: $this->request->email,
|
|
phone_1: $this->request->phone,
|
|
email_2: $this->request->contactEmail,
|
|
phone_2: null,
|
|
contact_person: $this->request->contactPerson,
|
|
allergies: $this->request->allergies,
|
|
intolerances: $this->request->intolerances,
|
|
medications: null,
|
|
tetanus_vaccination: null,
|
|
// Kein Wert der Zuordnung -- der SignUpCommand fällt damit auf "Omnivor" zurück.
|
|
eating_habit: '',
|
|
swimming_permission: $this->resolveSwimmingPermission($participantAge),
|
|
first_aid_permission: $participantAge->isfullAged() ? '-1' : ($this->request->firstAidPermission ?? '-1'),
|
|
foto_socialmedia: $this->request->foto_socialmedia,
|
|
foto_print: $this->request->foto_print,
|
|
foto_webseite: $this->request->foto_webseite,
|
|
foto_partner: $this->request->foto_partner,
|
|
foto_intern: $this->request->foto_intern,
|
|
arrival: $this->request->event->start_date,
|
|
departure: $this->request->event->end_date,
|
|
arrival_eating: 1,
|
|
departure_eating: 2,
|
|
notes: null,
|
|
amount: $amount,
|
|
paymentMethod: $this->request->paymentMethod,
|
|
paymentOptions: $this->request->paymentOptions,
|
|
participationOptions: $this->request->participationOptions,
|
|
addonItems: [],
|
|
feeType: 'standard',
|
|
siblingReduction: false,
|
|
);
|
|
|
|
$signUpResponse = new SignUpCommand($signUpRequest)->execute();
|
|
|
|
$response->success = $signUpResponse->success;
|
|
$response->participant = $signUpResponse->participant;
|
|
$response->message = $signUpResponse->message;
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* Bei Volljährigen und wenn die Veranstaltung die Badeerlaubnis nicht abfragt, entscheidet der SignUpCommand
|
|
* (volljährig => erteilt, nicht abgefragt => keine). Nur die getroffene Auswahl Minderjähriger wird
|
|
* durchgereicht.
|
|
*/
|
|
private function resolveSwimmingPermission(Age $participantAge) : ?string
|
|
{
|
|
if ($participantAge->isfullAged() || !$this->request->event->swimming_permission_required) {
|
|
return null;
|
|
}
|
|
|
|
return $this->request->swimmingPermission;
|
|
}
|
|
}
|