103 lines
4.1 KiB
PHP
103 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Event\Actions\UpdateEvent;
|
|
|
|
use App\Models\AvailablePaymentMethod;
|
|
use App\Models\PaymentMethod;
|
|
use App\RelationModels\EventPaymentMethods;
|
|
|
|
class UpdateEventCommand {
|
|
public UpdateEventRequest $request;
|
|
public function __construct(UpdateEventRequest $request) {
|
|
$this->request = $request;
|
|
}
|
|
|
|
public function execute() : UpdateEventResponse {
|
|
$response = new UpdateEventResponse();
|
|
|
|
if (count($this->request->paymentMethods) === 0) {
|
|
$response->success = false;
|
|
$response->message = 'Mindestens eine Zahlungsmöglichkeit muss ausgewählt sein.';
|
|
return $response;
|
|
}
|
|
|
|
$this->request->event->name = $this->request->eventName;
|
|
$this->request->event->location = $this->request->eventLocation;
|
|
$this->request->event->postal_code = $this->request->postalCode;
|
|
$this->request->event->email = $this->request->email;
|
|
$this->request->event->early_bird_end = $this->request->earlyBirdEnd;
|
|
$this->request->event->registration_final_end = $this->request->registrationFinalEnd;
|
|
$this->request->event->alcoholics_age = $this->request->alcoholicsAge;
|
|
$this->request->event->support_per_person = $this->request->supportPerPerson;
|
|
$this->request->event->support_flat = $this->request->flatSupport;
|
|
$this->request->event->send_weekly_report = $this->request->sendWeeklyReports;
|
|
$this->request->event->registration_allowed = $this->request->registrationAllowed;
|
|
$this->request->event->save();
|
|
|
|
$this->request->event->resetAllowedEatingHabits();
|
|
$this->request->event->resetContributingLocalGroups();
|
|
|
|
foreach($this->request->eatingHabits as $eatingHabit) {
|
|
$this->request->event->eatingHabits()->attach($eatingHabit);
|
|
}
|
|
|
|
foreach($this->request->contributingLocalGroups as $contributingLocalGroup) {
|
|
$this->request->event->localGroups()->attach($contributingLocalGroup);
|
|
}
|
|
|
|
$this->syncPaymentMethods();
|
|
|
|
$this->request->event->save();
|
|
$response->success = true;
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* Differenzieller Sync der Zahlungsmethoden mit Snapshot-Copy-Semantik:
|
|
* - entfernte Methoden werden gelöscht,
|
|
* - neue Methoden erhalten einen Snapshot der Tenant-Config (oder eines expliziten Overrides),
|
|
* - bestehende Methoden behalten ihre pro-Event-Config, sofern kein Override übergeben wird.
|
|
*/
|
|
private function syncPaymentMethods(): void
|
|
{
|
|
$event = $this->request->event;
|
|
$desiredSlugs = $this->request->paymentMethods;
|
|
$overrides = $this->request->paymentMethodConfigurations;
|
|
|
|
$existing = EventPaymentMethods::where('event_id', $event->id)->get()->keyBy('slug');
|
|
|
|
// Nicht mehr gewünschte Methoden entfernen.
|
|
foreach ($existing as $slug => $row) {
|
|
if (!in_array($slug, $desiredSlugs, true)) {
|
|
$row->delete();
|
|
}
|
|
}
|
|
|
|
// Tenant-Instanzen (für Snapshot-Kopie neuer Methoden) laden.
|
|
$tenantMethods = AvailablePaymentMethod::whereIn('slug', $desiredSlugs)->get()->keyBy('slug');
|
|
|
|
foreach ($desiredSlugs as $slug) {
|
|
$override = $overrides[$slug] ?? null;
|
|
|
|
if (isset($existing[$slug])) {
|
|
// Bestehende Zuweisung: Config nur bei explizitem Override anpassen, sonst unverändert lassen.
|
|
if ($override !== null) {
|
|
$row = $existing[$slug];
|
|
$row->configuration = PaymentMethod::sanitizeConfiguration($slug, $override);
|
|
$row->save();
|
|
}
|
|
continue;
|
|
}
|
|
|
|
// Neue Zuweisung: expliziter Override oder Snapshot der Tenant-Config.
|
|
$snapshot = $override ?? ($tenantMethods[$slug]->configuration ?? []);
|
|
EventPaymentMethods::create([
|
|
'event_id' => $event->id,
|
|
'slug' => $slug,
|
|
'configuration' => PaymentMethod::sanitizeConfiguration($slug, $snapshot ?? []),
|
|
]);
|
|
}
|
|
}
|
|
}
|