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 ?? []), ]); } } }