Kurzanmeldungen
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user