when($this->search, fn($q, $search) => $q->where('name', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%") ) ->when($this->roleFilter, fn($q, $role) => $q->whereHas('roles', fn($roleQuery) => $roleQuery->where('name', $role) ) ) ->when($this->parentPartnerFilter, fn($q, $parentPartnerId) => $q->whereHas('partner', fn($partnerQuery) => $partnerQuery->where('parent_partner_id', $parentPartnerId) ) ) ->when($this->brandFilter, fn($q, $brand) => $q->whereHas('partner', fn($partnerQuery) => $partnerQuery->where('brand', $brand) ) ) ->when($this->setupStatusFilter === 'completed', fn($q) => $q->whereHas('partner', fn($partnerQuery) => $partnerQuery->whereNotNull('setup_completed_at') ) ) ->when($this->setupStatusFilter === 'pending', fn($q) => $q->whereHas('partner', fn($partnerQuery) => $partnerQuery->whereNull('setup_completed_at') ) ) ->when($this->setupStatusFilter === 'no_partner', fn($q) => $q->whereNull('partner_id') ); // Finde alle Partner, die als parent_partner_id verwendet werden $parentPartnerIds = \App\Models\Partner::whereNotNull('parent_partner_id') ->distinct() ->pluck('parent_partner_id'); $availableParentPartners = \App\Models\Partner::whereIn('id', $parentPartnerIds) ->orderBy('company_name') ->get(); // Finde alle verfügbaren Brands $availableBrands = \App\Models\Partner::whereNotNull('brand') ->distinct() ->pluck('brand') ->sort(); // Zähle User mit abgeschlossenem Setup $setupCompletedCount = User::whereHas('partner', function($q) { $q->whereNotNull('setup_completed_at'); })->count(); return [ 'users' => $query->orderBy($this->sortField, $this->sortDirection)->paginate(15), 'totalUsers' => User::count(), 'verifiedUsers' => User::whereNotNull('email_verified_at')->count(), 'setupCompletedUsers' => $setupCompletedCount, 'availableRoles' => \Spatie\Permission\Models\Role::orderBy('name')->get(), 'availableParentPartners' => $availableParentPartners, 'availableBrands' => $availableBrands, 'selectedUser' => $this->selectedUserId ? User::find($this->selectedUserId) : null, 'editUser' => $this->editUserId ? User::find($this->editUserId) : null, 'viewUser' => $this->viewUserId ? User::with(['partner.brand', 'roles'])->find($this->viewUserId) : null, ]; } public function sortBy(string $field): void { if ($this->sortField === $field) { $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; } else { $this->sortField = $field; $this->sortDirection = 'asc'; } } public function updatingSearch(): void { $this->resetPage(); } public function updatingRoleFilter(): void { $this->resetPage(); } public function updatingParentPartnerFilter(): void { $this->resetPage(); } public function updatingBrandFilter(): void { $this->resetPage(); } public function updatingSetupStatusFilter(): void { $this->resetPage(); } public function openRoleModal(int $userId): void { $user = User::with('roles')->findOrFail($userId); $this->selectedUserId = $userId; $this->selectedRoles = $user->roles->pluck('name')->toArray(); $this->showRoleModal = true; } public function saveRoles(): void { if (!$this->selectedUserId) { return; } $user = User::findOrFail($this->selectedUserId); $user->syncRoles($this->selectedRoles); $this->showRoleModal = false; $this->selectedUserId = null; $this->selectedRoles = []; // Optional: Flash message session()->flash('message', __('Roles updated successfully!')); } public function closeRoleModal(): void { $this->showRoleModal = false; $this->selectedUserId = null; $this->selectedRoles = []; } public function openEditModal(int $userId): void { $user = User::findOrFail($userId); $this->editUserId = $userId; $this->userName = $user->name; $this->displayName = $user->display_name ?? ''; $this->userEmail = $user->email; $this->emailVerified = !is_null($user->email_verified_at); $this->showEditModal = true; } public function saveUser(): void { if (!$this->editUserId) { return; } $user = User::with('roles')->findOrFail($this->editUserId); // Prüfe ob User eine Rolle hat, die display_name erfordert $requiresDisplayName = $user->roles->whereIn('name', ['Broker', 'Retailer', 'Manufacturer'])->isNotEmpty(); $rules = [ 'userName' => 'required|string|max:255', 'displayName' => $requiresDisplayName ? 'required|string|max:255' : 'nullable|string|max:255', 'userEmail' => 'required|email|max:255|unique:users,email,' . $this->editUserId, ]; $messages = [ 'displayName.required' => __('Name für die Zuordnung von Kunden ist für Makler, Händler und Hersteller erforderlich.'), ]; $this->validate($rules, $messages); $user->update([ 'name' => $this->userName, 'display_name' => $this->displayName ?: null, 'email' => $this->userEmail, 'email_verified_at' => $this->emailVerified ? ($user->email_verified_at ?? now()) : null, ]); $this->showEditModal = false; $this->reset(['editUserId', 'userName', 'displayName', 'userEmail', 'emailVerified']); session()->flash('message', __('User updated successfully!')); } public function closeEditModal(): void { $this->showEditModal = false; $this->reset(['editUserId', 'userName', 'displayName', 'userEmail', 'emailVerified']); } public function openViewModal(int $userId): void { $this->viewUserId = $userId; $this->showViewModal = true; } public function closeViewModal(): void { $this->showViewModal = false; $this->viewUserId = null; } public function deleteUser(int $userId): void { $user = User::findOrFail($userId); // Prüfe auf Verknüpfungen if ($user->hasDependencies()) { // Anonymisiere statt zu löschen $user->anonymize(); session()->flash('message', __('User wurde anonymisiert, da Verknüpfungen existieren.')); } else { // Soft Delete $user->delete(); session()->flash('message', __('User deleted successfully!')); } // Schließe ggf. offene Modals $this->showRoleModal = false; $this->showEditModal = false; $this->reset(['selectedUserId', 'editUserId']); } public function loginAsUser(int $userId): void { $currentUser = Auth::user(); $targetUser = User::findOrFail($userId); // Speichere den aktuellen Admin-User in der Session session(['impersonate_from' => $currentUser->id]); // Logge als Ziel-User ein Auth::login($targetUser); // Weiterleitung zum Dashboard $this->redirect(route('dashboard'), navigate: false); } }; ?>
{{-- Header --}}
{{ __('Benutzerverwaltung') }} {{ __('Manage users and their roles in your application') }}
{{--
{{ __('Create User') }}
--}}
{{-- Statistics --}}
{{ __('Total Users') }} {{ $totalUsers }}
{{ __('Verified Users') }} {{ $verifiedUsers }}
{{ __('Setup abgeschlossen') }} {{ $setupCompletedUsers }}
{{ __('Active Roles') }} {{ $availableRoles->count() }}
{{-- Filters --}}
{{ __('All Roles') }} @foreach($availableRoles as $role) {{ $role->display_name ?? $role->name }} @endforeach {{ __('Alle Brands') }} @foreach($availableBrands as $brand) {{ strtoupper($brand) }} @endforeach {{ __('Alle Partner-Zuordnungen') }} @foreach($availableParentPartners as $partner) {{ $partner->company_name }} @endforeach {{ __('Alle Setup-Status') }} {{ __('Setup abgeschlossen') }} {{ __('Setup ausstehend') }} {{ __('Kein Partner') }} @if($search || $roleFilter || $parentPartnerFilter || $brandFilter || $setupStatusFilter) {{ __('Clear Filters') }} @endif
{{-- Users Table --}}
{{ __('User') }} @if($sortField === 'name') @endif
{{ __('Email') }} @if($sortField === 'email') @endif
{{ __('roles.role') }}
{{ __('Registrierung & Setup') }} @if($sortField === 'created_at') @endif
{{ __('Status') }} {{ __('Actions') }}
@forelse($users as $user)
{{ $user->initials() }}
{{ $user->name }}
@if($user->display_name)
{{ $user->display_name }}
@endif
@if($user->registrationCode) {{ $user->registrationCode->code }} @else {{ __('Kein Code') }} @endif @if($user->partner && $user->partner->brand) @php $brandColors = [ 'b2in' => 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400', 'style2own' => 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400', 'stileigentum' => 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400', 'b2a' => 'bg-teal-100 text-teal-700 dark:bg-teal-900/30 dark:text-teal-400', ]; $brandColor = $brandColors[$user->partner->brand] ?? 'bg-zinc-100 text-zinc-700 dark:bg-zinc-800 dark:text-zinc-400'; @endphp {{ strtoupper($user->partner->brand) }} @endif
{{ $user->email }}
{{-- Registrierungsdatum --}}
{{ $user->created_at->format('d.m.Y H:i') }} {{ __('Registriert') }}
{{-- Setup-Abschluss --}} @if($user->partner && $user->partner->setup_completed_at)
{{ $user->partner->setup_completed_at->format('d.m.Y H:i') }} {{ __('Setup abgeschlossen') }}
@else
{{ __('Setup ausstehend') }}
@endif
@if($user->email_verified_at) {{ __('Verified') }} @else {{ __('Unverified') }} @endif
@if($user->partner_id) @endif @if($user->id !== Auth::id()) @endif @if($user->id !== Auth::id()) @endif
@empty
{{ __('No users found') }} @if($search || $roleFilter || $parentPartnerFilter || $brandFilter || $setupStatusFilter) {{ __('Try adjusting your filters.') }} @else {{ __('Get started by creating a new user.') }} @endif
@endforelse
{{-- Pagination --}} @if($users->hasPages())
{{ $users->links() }}
@endif
{{-- Role Assignment Modal --}}
{{ __('Assign Roles') }} @if($selectedUser) {{ __('Managing roles for') }} {{ $selectedUser->name }} @endif
{{ __('roles.role') }} {{ __('Select one or multiple roles for this user') }}
@foreach($availableRoles as $role) @endforeach
@if(!empty($selectedRoles))
{{ __('Selected Roles:') }}
@foreach($selectedRoles as $roleName) @php $roleObj = $availableRoles->firstWhere('name', $roleName); @endphp {{ $roleName }} @endforeach
@endif
{{ __('Cancel') }} {{ __('Save Roles') }}
{{-- Edit User Modal --}}
{{ __('Edit User') }} @if($editUser) {{ __('Editing user') }}: {{ $editUser->name }} @endif
{{ __('Name') }} @error('userName') {{ $message }} @enderror {{ __('Name für die Zuordnung von Kunden') }} @if($editUser && $editUser->roles->whereIn('name', ['Broker', 'Retailer', 'Manufacturer'])->isNotEmpty()) * @endif {{ __('Pflichtfeld für Makler, Händler und Hersteller') }} @error('displayName') {{ $message }} @enderror {{ __('Email') }} @error('userEmail') {{ $message }} @enderror {{ __('Email Verification') }} {{ __('Set whether the email address is verified') }} @if($editUser && $editUser->registrationCode) {{ __('Registration Code') }}
{{ $editUser->registrationCode->code }}
{{ __('Registered with this code') }}
@endif
{{ __('Cancel') }} {{ __('Save User') }}
{{-- View Partner Data Modal --}} @if($viewUser && $viewUser->partner) @php $partner = $viewUser->partner; $normalizedType = strtolower(str_replace('-', '', $partner->type)); $isCustomer = $normalizedType === 'customer'; $isBroker = $normalizedType === 'broker' || $normalizedType === 'estateagent'; $isRetailer = $normalizedType === 'retailer'; $isManufacturer = $normalizedType === 'manufacturer'; $role = $viewUser->roles->first(); $roleIcon = $role?->icon ?? 'shield-check'; $roleName = $role?->display_name ?? $role?->name ?? '-'; @endphp
{{-- Header --}}
{{ __('Partner-Daten') }}
@svg('heroicon-o-'.$roleIcon, 'w-5 h-5 text-accent-600 dark:text-accent-400') {{ $roleName }}
{{ __('Benutzer') }}: {{ $viewUser->name }}
{{-- Firmeninformationen --}} @if (!$isCustomer)
{{ __('Firmeninformationen') }}
{{ __('Firmenname') }}
{{ $partner->company_name ?: '-' }}
@if ($isBroker)
{{ __('Anzeigename') }}
{{ $partner->display_name ?: '-' }}
@endif @if ($partner->description)
{{ __('Kurzbeschreibung') }}
{{ $partner->description }}
@endif
@endif {{-- Persönliche Daten --}}
{{ __('Persönliche Daten') }}
{{ __('Anrede') }}
{{ $partner->salutation ?: '-' }}
{{ __('Vorname') }}
{{ $partner->first_name ?: '-' }}
{{ __('Nachname') }}
{{ $partner->last_name ?: '-' }}
{{-- Adresse --}}
{{ __('Adresse') }}
{{ __('Straße') }}
{{ $partner->street ?: '-' }}
{{ __('Hausnummer') }}
{{ $partner->house_number ?: '-' }}
{{ __('Postleitzahl') }}
{{ $partner->zip ?: '-' }}
{{ __('Ort') }}
{{ $partner->city ?: '-' }}
{{ __('Land') }}
{{ $partner->country ?: '-' }}
{{-- Kontaktdaten --}}
{{ __('Kontaktdaten') }}
{{ __('Telefon') }}
{{ $partner->phone ?: '-' }}
@if (!$isCustomer)
{{ __('Website') }}
@if($partner->website) {{ $partner->website }} @else - @endif
@endif
{{-- Liefergebiete für Händler --}} @if ($isRetailer)
{{ __('Liefergebiete') }}
{{ __('Lieferradius') }}
{{ $partner->delivery_radius_km ? $partner->delivery_radius_km . ' km' : '-' }}
{{ __('Montageradius') }}
{{ $partner->assembly_radius_km ? $partner->assembly_radius_km . ' km' : '-' }}
@endif {{-- Marke für Hersteller --}} @if ($isManufacturer && $partner->brand)
{{ __('Markeninformationen') }}
{{ __('Markenname') }}
@if(isset($partner->brand->name)) {{ $partner->brand->name }} @else - @endif
@if(isset($partner->brand->description))
{{ __('Marken-Beschreibung') }}
{{ $partner->brand->description }}
@endif
{{ __('Status') }}
@if(isset($partner->brand->is_active) && $partner->brand->is_active === true) {{ __('Aktiv') }} @else {{ __('Inaktiv') }} @endif
@endif {{-- Close Button --}}
{{ __('Schließen') }}
@else
{{ __('Partner-Daten') }} {{ __('Dieser Benutzer hat keine Partner-Daten') }}
{{ __('Schließen') }}
@endif
{{-- Success Message --}} @if (session()->has('message')) {{ session('message') }} @endif