From 26ce2544f0bf30396316cfc948eb6bf1ab8ce764 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Wed, 8 Jul 2026 09:44:17 +0000 Subject: [PATCH] UI: Agentur-Angaben im Profil, Firmen-Typ-Auswahl entfernt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A5 des Umbaus Agentur-Attribution → User-Profil: Kunden-Profil erhält den Abschnitt „Agentur-Angaben" (Feld Agentur-/Verteilername, öffentlich als Übermittler sichtbar). Firma-Anlegen (Kunde + Admin) und Admin-Firma-Bearbeiten kommen ohne Typ-Feld aus — Neuanlagen sind immer type=company. Firmen-Übersicht zeigt kein Typ-Label mehr. Admin-User- Formulare pflegen agency_name; die Detailseite zeigt den Übermittler als Badge. CompanyFactory erzeugt keine zufälligen Agentur-Typen mehr. Co-Authored-By: Claude Fable 5 --- .../Concerns/ProvidesUserFormRules.php | 1 + database/factories/CompanyFactory.php | 4 ++- .../livewire/admin/companies/create.blade.php | 34 ++++++------------- .../livewire/admin/companies/edit.blade.php | 33 +++++------------- .../livewire/admin/users/create.blade.php | 10 ++++++ .../views/livewire/admin/users/edit.blade.php | 11 ++++++ .../views/livewire/admin/users/show.blade.php | 5 +++ .../customer/press-kits/create.blade.php | 21 ++---------- .../customer/press-kits/index.blade.php | 27 ++++++--------- .../views/livewire/customer/profile.blade.php | 29 +++++++++++++++- tests/Feature/Admin/UserManagementTest.php | 5 ++- .../CustomerPressKitCreatePhase8eTest.php | 5 +-- tests/Feature/CustomerProfileSecurityTest.php | 3 ++ 13 files changed, 98 insertions(+), 90 deletions(-) diff --git a/app/Livewire/Concerns/ProvidesUserFormRules.php b/app/Livewire/Concerns/ProvidesUserFormRules.php index 7561b9c1..8a6c88ea 100644 --- a/app/Livewire/Concerns/ProvidesUserFormRules.php +++ b/app/Livewire/Concerns/ProvidesUserFormRules.php @@ -29,6 +29,7 @@ trait ProvidesUserFormRules return [ 'name' => ['required', 'string', 'max:255'], + 'agencyName' => ['nullable', 'string', 'max:190'], 'email' => ['required', 'email', $emailUnique], 'portal' => ['required', Rule::in(array_map(static fn (Portal $portal): string => $portal->value, Portal::cases()))], 'registrationType' => ['required', Rule::in(array_map(static fn (RegistrationType $type): string => $type->value, RegistrationType::cases()))], diff --git a/database/factories/CompanyFactory.php b/database/factories/CompanyFactory.php index 07abd506..13b65d3b 100644 --- a/database/factories/CompanyFactory.php +++ b/database/factories/CompanyFactory.php @@ -21,7 +21,9 @@ class CompanyFactory extends Factory return [ 'portal' => fake()->randomElement([Portal::Presseecho->value, Portal::Businessportal24->value]), - 'type' => fake()->randomElement(CompanyType::cases())->value, + // Neuanlagen sind immer Newsrooms; der Legacy-Typ „agency" wird + // nur noch in Tests der Daten-Commands explizit gesetzt. + 'type' => CompanyType::Company->value, 'name' => $name, 'slug' => Str::slug($name).'-'.fake()->unique()->numberBetween(1000, 9999), 'address' => fake()->streetAddress(), diff --git a/resources/views/livewire/admin/companies/create.blade.php b/resources/views/livewire/admin/companies/create.blade.php index 909de88c..1baefafc 100644 --- a/resources/views/livewire/admin/companies/create.blade.php +++ b/resources/views/livewire/admin/companies/create.blade.php @@ -17,8 +17,6 @@ new #[Layout('components.layouts.app'), Title('Neue Firma')] class extends Compo public string $portal = 'both'; - public string $type = 'company'; - #[Validate('required|min:3|max:255')] public string $company_name = ''; @@ -70,7 +68,9 @@ new #[Layout('components.layouts.app'), Title('Neue Firma')] class extends Compo $company = Company::query()->create([ 'portal' => $this->portal, - 'type' => $this->type, + // Firmen sind ausschließlich Newsrooms; der Übermittler + // („Agentur") ist eine Profil-Eigenschaft des Accounts. + 'type' => CompanyType::Company->value, 'name' => $this->company_name, 'slug' => $slug, 'address' => $this->composeAddress(), @@ -112,7 +112,6 @@ new #[Layout('components.layouts.app'), Title('Neue Firma')] class extends Compo ['code' => 'US', 'name' => 'USA'], ]), 'portalOptions' => Portal::cases(), - 'typeOptions' => CompanyType::cases(), ]; } @@ -149,25 +148,14 @@ new #[Layout('components.layouts.app'), Title('Neue Firma')] class extends Compo {{ __('Basisinformationen') }}
-
- - {{ __('Portal') }} - - @foreach ($portalOptions as $portalOption) - - @endforeach - - - - - {{ __('Typ') }} - - @foreach ($typeOptions as $typeOption) - - @endforeach - - -
+ + {{ __('Portal') }} + + @foreach ($portalOptions as $portalOption) + + @endforeach + + {{ __('Firmenname') }} * diff --git a/resources/views/livewire/admin/companies/edit.blade.php b/resources/views/livewire/admin/companies/edit.blade.php index 734abdf4..80566095 100644 --- a/resources/views/livewire/admin/companies/edit.blade.php +++ b/resources/views/livewire/admin/companies/edit.blade.php @@ -1,6 +1,5 @@ portal = $company->portal?->value ?? Portal::Both->value; - $this->type = $company->type?->value ?? CompanyType::Company->value; $this->company_name = $company->name; $this->description = ''; $this->email = $company->email ?? ''; @@ -134,7 +130,6 @@ new #[Layout('components.layouts.app'), Title('Firma bearbeiten')] class extends $company->update([ 'portal' => $this->portal, - 'type' => $this->type, 'name' => $this->company_name, 'slug' => $slug, 'address' => $this->composeAddress(), @@ -163,7 +158,6 @@ new #[Layout('components.layouts.app'), Title('Firma bearbeiten')] class extends ['code' => 'US', 'name' => 'USA'], ]), 'portalOptions' => Portal::cases(), - 'typeOptions' => CompanyType::cases(), ]; } @@ -219,25 +213,14 @@ new #[Layout('components.layouts.app'), Title('Firma bearbeiten')] class extends {{ __('Basisinformationen') }}
-
- - {{ __('Portal') }} - - @foreach ($portalOptions as $portalOption) - - @endforeach - - - - - {{ __('Typ') }} - - @foreach ($typeOptions as $typeOption) - - @endforeach - - -
+ + {{ __('Portal') }} + + @foreach ($portalOptions as $portalOption) + + @endforeach + + {{ __('Firmenname') }} * diff --git a/resources/views/livewire/admin/users/create.blade.php b/resources/views/livewire/admin/users/create.blade.php index 3e1ff920..0bedcdc6 100644 --- a/resources/views/livewire/admin/users/create.blade.php +++ b/resources/views/livewire/admin/users/create.blade.php @@ -18,6 +18,8 @@ new #[Layout('components.layouts.app'), Title('Benutzer anlegen')] class extends public string $name = ''; + public string $agencyName = ''; + public string $email = ''; public string $portal = ''; @@ -116,6 +118,7 @@ new #[Layout('components.layouts.app'), Title('Benutzer anlegen')] class extends $user = User::query()->create([ 'name' => $validated['name'], + 'agency_name' => $validated['agencyName'] ?: null, 'email' => $validated['email'], 'portal' => $validated['portal'], 'registration_type' => $validated['registrationType'], @@ -236,6 +239,13 @@ new #[Layout('components.layouts.app'), Title('Benutzer anlegen')] class extends + + {{ __('Agentur-/Verteilername') }} + + {{ __('Erscheint öffentlich als Übermittler („übermittelt von …") unter den Mitteilungen dieses Accounts.') }} + + + {{ __('Portal') }} diff --git a/resources/views/livewire/admin/users/edit.blade.php b/resources/views/livewire/admin/users/edit.blade.php index 35976bb0..7cc8847a 100644 --- a/resources/views/livewire/admin/users/edit.blade.php +++ b/resources/views/livewire/admin/users/edit.blade.php @@ -24,6 +24,8 @@ new #[Layout('components.layouts.app'), Title('Benutzer bearbeiten')] class exte public string $name = ''; + public string $agencyName = ''; + public string $email = ''; public string $portal = ''; @@ -149,6 +151,7 @@ new #[Layout('components.layouts.app'), Title('Benutzer bearbeiten')] class exte ->findOrFail($id); $this->name = $user->name; + $this->agencyName = (string) ($user->agency_name ?? ''); $this->email = $user->email; $this->portal = $user->portal?->value ?? Portal::Both->value; $this->registrationType = $user->registration_type?->value ?? RegistrationType::ExistingLegacy->value; @@ -410,6 +413,7 @@ new #[Layout('components.layouts.app'), Title('Benutzer bearbeiten')] class exte $user->update([ 'name' => $validated['name'], + 'agency_name' => $validated['agencyName'] ?: null, 'email' => $validated['email'], 'portal' => $validated['portal'], 'registration_type' => $validated['registrationType'], @@ -819,6 +823,13 @@ new #[Layout('components.layouts.app'), Title('Benutzer bearbeiten')] class exte + + {{ __('Agentur-/Verteilername') }} + + {{ __('Erscheint öffentlich als Übermittler („übermittelt von …") unter den Mitteilungen dieses Accounts.') }} + + + {{ __('Portal') }} diff --git a/resources/views/livewire/admin/users/show.blade.php b/resources/views/livewire/admin/users/show.blade.php index 258615fb..80b2df3a 100644 --- a/resources/views/livewire/admin/users/show.blade.php +++ b/resources/views/livewire/admin/users/show.blade.php @@ -80,6 +80,11 @@ new #[Layout('components.layouts.app'), Title('Benutzer anzeigen')] class extend > ID #{{ $user->id }} + @if (filled($user->agency_name)) + + {{ __('Übermittler') }}: {{ $user->agency_name }} + + @endif @if ($user->is_active) {{ __('Aktiv') }} @else diff --git a/resources/views/livewire/customer/press-kits/create.blade.php b/resources/views/livewire/customer/press-kits/create.blade.php index 89620cff..05a2dfec 100644 --- a/resources/views/livewire/customer/press-kits/create.blade.php +++ b/resources/views/livewire/customer/press-kits/create.blade.php @@ -16,8 +16,6 @@ new #[Layout('components.layouts.app'), Title('Neue Firma anlegen')] class exten public string $portal = ''; - public string $type = ''; - public string $address = ''; public string $email = ''; @@ -32,7 +30,6 @@ new #[Layout('components.layouts.app'), Title('Neue Firma anlegen')] class exten public function mount(): void { - $this->type = CompanyType::Company->value; $this->countryCode = (string) config('countries.default', 'DE'); } @@ -46,7 +43,6 @@ new #[Layout('components.layouts.app'), Title('Neue Firma anlegen')] class exten Portal::Businessportal24->value, Portal::Both->value, ])], - 'type' => ['required', Rule::in([CompanyType::Company->value, CompanyType::Agency->value])], 'address' => ['nullable', 'string', 'max:1000'], 'email' => ['nullable', 'email', 'max:190'], 'phone' => ['nullable', 'string', 'max:40'], @@ -72,7 +68,9 @@ new #[Layout('components.layouts.app'), Title('Neue Firma anlegen')] class exten $company = new Company([ 'portal' => $validated['portal'], 'owner_user_id' => $user->id, - 'type' => $validated['type'], + // Firmen sind ausschließlich Newsrooms; der Übermittler + // („Agentur") ist eine Profil-Eigenschaft des Accounts. + 'type' => CompanyType::Company->value, 'name' => $validated['name'], 'address' => $validated['address'] ?: null, 'country_code' => $validated['countryCode'] ?: null, @@ -110,10 +108,6 @@ new #[Layout('components.layouts.app'), Title('Neue Firma anlegen')] class exten Portal::Businessportal24->value => Portal::Businessportal24->label(), Portal::Both->value => Portal::Both->label(), ], - 'types' => [ - CompanyType::Company->value => CompanyType::Company->label(), - CompanyType::Agency->value => CompanyType::Agency->label(), - ], 'countries' => (array) config('countries.items', []), ]; } @@ -162,15 +156,6 @@ new #[Layout('components.layouts.app'), Title('Neue Firma anlegen')] class exten - - - @foreach ($types as $value => $label) - {{ $label }} - @endforeach - - - - diff --git a/resources/views/livewire/customer/press-kits/index.blade.php b/resources/views/livewire/customer/press-kits/index.blade.php index 98b4e23b..d6ed4490 100644 --- a/resources/views/livewire/customer/press-kits/index.blade.php +++ b/resources/views/livewire/customer/press-kits/index.blade.php @@ -259,29 +259,23 @@ new #[Layout('components.layouts.app'), Title('Meine Firmen')] class extends Com } /** - * Liefert eine kompakte Meta-Line: Stadt · Typ. + * Liefert eine kompakte Meta-Line: die Stadt aus der Adresse. + * (Kein Typ-Label mehr — seit dem Umbau der Agentur-Attribution + * gibt es nur noch einen Firmen-Typ.) */ public function metaLine(Company $company): string { - $parts = []; - $address = trim((string) ($company->address ?? '')); - if (filled($address)) { - $lastLine = collect(preg_split('/\r?\n/', $address)) - ->map(fn ($line) => trim((string) $line)) - ->filter() - ->last(); - if (is_string($lastLine) && filled($lastLine)) { - $parts[] = $lastLine; - } + if (blank($address)) { + return ''; } - $type = $company->type?->label(); - if (is_string($type) && filled($type)) { - $parts[] = $type; - } + $lastLine = collect(preg_split('/\r?\n/', $address)) + ->map(fn ($line) => trim((string) $line)) + ->filter() + ->last(); - return implode(' · ', $parts); + return is_string($lastLine) ? $lastLine : ''; } /** @@ -330,7 +324,6 @@ new #[Layout('components.layouts.app'), Title('Meine Firmen')] class extends Com 'companies.id', 'companies.owner_user_id', 'companies.portal', - 'companies.type', 'companies.name', 'companies.address', 'companies.logo_path', diff --git a/resources/views/livewire/customer/profile.blade.php b/resources/views/livewire/customer/profile.blade.php index c61964f9..0979f34c 100644 --- a/resources/views/livewire/customer/profile.blade.php +++ b/resources/views/livewire/customer/profile.blade.php @@ -12,6 +12,8 @@ new #[Layout('components.layouts.app'), Title('Mein Profil')] class extends Comp { public string $name = ''; + public string $agencyName = ''; + public string $language = 'de'; public string $salutationKey = 'none'; @@ -64,6 +66,7 @@ new #[Layout('components.layouts.app'), Title('Mein Profil')] class extends Comp $profile = $user->profile; $this->name = (string) $user->name; + $this->agencyName = (string) ($user->agency_name ?? ''); $this->language = $user->language ?? 'de'; $this->salutationKey = (string) ($profile?->salutation_key ?? 'none'); @@ -146,6 +149,7 @@ new #[Layout('components.layouts.app'), Title('Mein Profil')] class extends Comp { $rules = [ 'name' => ['required', 'string', 'max:120'], + 'agencyName' => ['nullable', 'string', 'max:190'], 'language' => ['required', Rule::in(['de', 'en'])], 'salutationKey' => ['required', Rule::in(array_keys((array) config('salutations.items', [])))], 'firstName' => ['nullable', 'string', 'max:80'], @@ -204,6 +208,7 @@ new #[Layout('components.layouts.app'), Title('Mein Profil')] class extends Comp $user->forceFill([ 'name' => $validated['name'], + 'agency_name' => $validated['agencyName'] ?: null, 'language' => $validated['language'], ])->save(); @@ -495,7 +500,29 @@ new #[Layout('components.layouts.app'), Title('Mein Profil')] class extends Comp
- {{-- ============== 3) EINSTELLUNGEN ============== --}} + {{-- ============== 3) AGENTUR-ANGABEN ============== --}} +
+
+ {{ __('Agentur-Angaben') }} +
+
+

+ {{ __('Falls Sie Pressemitteilungen im Auftrag Dritter einreichen, erscheint diese Angabe öffentlich als Übermittler unter Ihren Mitteilungen.') }} +

+ +
+
+ + {{ __('Speichern') }} + +
+
+ + {{-- ============== 4) EINSTELLUNGEN ============== --}}
{{ __('Einstellungen') }} diff --git a/tests/Feature/Admin/UserManagementTest.php b/tests/Feature/Admin/UserManagementTest.php index 1ae6db23..46b5801d 100644 --- a/tests/Feature/Admin/UserManagementTest.php +++ b/tests/Feature/Admin/UserManagementTest.php @@ -1242,7 +1242,6 @@ test('admin can create and edit company with persisted data', function () { LivewireVolt::test('admin.companies.create') ->set('portal', 'presseecho') - ->set('type', 'company') ->set('company_name', 'Persist GmbH') ->set('email', 'info@persist-gmbh.de') ->set('phone', '04099999') @@ -1264,7 +1263,6 @@ test('admin can create and edit company with persisted data', function () { LivewireVolt::test('admin.companies.edit', ['id' => $company->id]) ->set('company_name', 'Persist GmbH Updated') ->set('portal', 'businessportal24') - ->set('type', 'agency') ->set('email', 'office@persist-gmbh.de') ->set('phone', '04077777') ->set('website', 'https://updated-persist.de') @@ -1279,7 +1277,8 @@ test('admin can create and edit company with persisted data', function () { $company->refresh(); expect($company->name)->toBe('Persist GmbH Updated'); expect($company->portal?->value)->toBe('businessportal24'); - expect($company->type?->value)->toBe('agency'); + // Kein Typ-Feld mehr: Firmen sind seit dem Attributions-Umbau immer Newsrooms. + expect($company->type?->value)->toBe('company'); expect($company->email)->toBe('office@persist-gmbh.de'); expect($company->is_active)->toBeFalse(); }); diff --git a/tests/Feature/CustomerPressKitCreatePhase8eTest.php b/tests/Feature/CustomerPressKitCreatePhase8eTest.php index bc66b602..59af21e6 100644 --- a/tests/Feature/CustomerPressKitCreatePhase8eTest.php +++ b/tests/Feature/CustomerPressKitCreatePhase8eTest.php @@ -45,7 +45,6 @@ test('save erstellt eine Firma und ordnet sie dem User als Owner zu', function ( ->test('customer.press-kits.create') ->set('name', 'Neue Brauerei AG') ->set('portal', 'presseecho') - ->set('type', 'company') ->set('email', 'kontakt@brauerei.de') ->call('save') ->assertHasNoErrors() @@ -57,6 +56,9 @@ test('save erstellt eine Firma und ordnet sie dem User als Owner zu', function ( expect($company)->not->toBeNull() ->and($company->owner_user_id)->toBe($customer->id) ->and($company->portal->value)->toBe('presseecho') + // Ohne Typ-Feld immer Newsroom: der Übermittler („Agentur") lebt + // seit dem Attributions-Umbau im Profilfeld users.agency_name. + ->and($company->type?->value)->toBe('company') ->and($company->email)->toBe('kontakt@brauerei.de') ->and($company->is_active)->toBeTrue(); @@ -96,7 +98,6 @@ test('save akzeptiert Portal Both', function () { ->test('customer.press-kits.create') ->set('name', 'Beide Portale GmbH') ->set('portal', 'both') - ->set('type', 'company') ->call('save') ->assertHasNoErrors(); diff --git a/tests/Feature/CustomerProfileSecurityTest.php b/tests/Feature/CustomerProfileSecurityTest.php index ac6b906f..5fad298c 100644 --- a/tests/Feature/CustomerProfileSecurityTest.php +++ b/tests/Feature/CustomerProfileSecurityTest.php @@ -30,7 +30,9 @@ test('customer can update own profile fields', function () { LivewireVolt::test('customer.profile') ->assertSee('Rechnungsadresse') + ->assertSee('Agentur-Angaben') ->set('name', 'Neuer Anzeigename') + ->set('agencyName', 'Muster Presseverteiler') ->set('firstName', 'Max') ->set('lastName', 'Mustermann') ->set('language', 'en') @@ -51,6 +53,7 @@ test('customer can update own profile fields', function () { $customer->refresh(); expect($customer->name)->toBe('Neuer Anzeigename'); + expect($customer->agency_name)->toBe('Muster Presseverteiler'); expect($customer->language)->toBe('en'); expect($customer->profile?->first_name)->toBe('Max'); expect($customer->profile?->last_name)->toBe('Mustermann');