isSuperAdmin()) { // Normale Admins werden zu ihrem Dashboard weitergeleitet return redirect()->route('admin.dashboard'); } $tenants = Tenant::where('is_active', true) ->withCount(['users', 'vendingMachines', 'products']) ->get(); return view('admin.tenants.select', compact('tenants')); } /** * Wechsle zu einem bestimmten Mandanten (nur für Super-Admin) */ public function switch(Request $request, Tenant $tenant) { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } if (!$tenant->is_active) { return redirect()->back()->with('error', 'Mandant ist nicht aktiv.'); } // Setze Mandanten-Kontext in Session session(['current_tenant_id' => $tenant->id, 'current_tenant' => $tenant]); return redirect()->route('admin.dashboard') ->with('success', "Gewechselt zu Mandant: {$tenant->name}"); } /** * Verlasse Mandanten-Kontext (zurück zur Auswahl) */ public function leave() { session()->forget(['current_tenant_id', 'current_tenant']); return redirect()->route('tenants.select') ->with('success', 'Mandanten-Kontext verlassen.'); } /** * Zeige alle Mandanten (Super-Admin Management) */ public function index() { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } $tenants = Tenant::withCount(['users', 'vendingMachines', 'products']) ->paginate(10); return view('admin.tenants.index', compact('tenants')); } /** * Zeige Formular zum Erstellen eines neuen Mandanten */ public function create() { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } return view('admin.tenants.create'); } /** * Speichere einen neuen Mandanten */ public function store(Request $request) { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } $validated = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'domain' => 'nullable|string|max:255|unique:tenants,domain', 'public_slug' => 'nullable|string|max:100|regex:/^[a-z0-9-]+$/|unique:tenants,public_slug', 'logo' => 'nullable|image|max:2048', 'is_active' => 'boolean', 'show_prices' => 'boolean', 'show_stock' => 'boolean', 'street' => 'nullable|string|max:255', 'house_number' => 'nullable|string|max:20', 'postal_code' => 'nullable|string|max:10', 'city' => 'nullable|string|max:255', 'country' => 'nullable|string|max:255' ], [ 'public_slug.regex' => 'Der öffentliche Slug darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten.', 'public_slug.unique' => 'Dieser öffentliche Slug wird bereits verwendet.' ]); if ($request->hasFile('logo')) { $logoPath = $request->file('logo')->store('tenant-logos', 'public'); $validated['logo'] = $logoPath; } $tenant = Tenant::create($validated); return redirect()->route('admin.tenants.index') ->with('success', 'Mandant erfolgreich erstellt.'); } /** * Zeige Details eines Mandanten */ public function show(Tenant $tenant) { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } $tenant->loadCount(['users', 'vendingMachines', 'products']); return view('admin.tenants.show', compact('tenant')); } /** * Zeige Formular zum Bearbeiten eines Mandanten */ public function edit(Tenant $tenant) { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } return view('admin.tenants.edit', compact('tenant')); } /** * Aktualisiere einen Mandanten */ public function update(Request $request, Tenant $tenant) { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } // Debug Logging für Checkbox-Werte \Log::info('TenantController Update:', [ 'tenant_id' => $tenant->id, 'all_data' => $request->all(), 'has_show_prices' => $request->has('show_prices'), 'has_show_stock' => $request->has('show_stock'), 'show_prices_value' => $request->input('show_prices'), 'show_stock_value' => $request->input('show_stock') ]); $validated = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'domain' => 'nullable|string|max:255|unique:tenants,domain,' . $tenant->id, 'public_slug' => 'nullable|string|max:100|regex:/^[a-z0-9-]+$/|unique:tenants,public_slug,' . $tenant->id, 'logo' => 'nullable|image|max:2048', 'is_active' => 'boolean', // ENTFERNT: 'show_prices' => 'boolean', // ENTFERNT: 'show_stock' => 'boolean', 'street' => 'nullable|string|max:255', 'house_number' => 'nullable|string|max:20', 'postal_code' => 'nullable|string|max:10', 'city' => 'nullable|string|max:255', 'country' => 'nullable|string|max:255' ], [ 'public_slug.regex' => 'Der öffentliche Slug darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten.', 'public_slug.unique' => 'Dieser öffentliche Slug wird bereits verwendet.' ]); // Checkboxes manuell verarbeiten $validated['show_prices'] = $request->has('show_prices'); $validated['show_stock'] = $request->has('show_stock'); \Log::info('Validated data for update:', $validated); if ($request->hasFile('logo')) { // Lösche altes Logo falls vorhanden if ($tenant->logo && file_exists(storage_path('app/public/' . $tenant->logo))) { unlink(storage_path('app/public/' . $tenant->logo)); } $logoPath = $request->file('logo')->store('tenant-logos', 'public'); $validated['logo'] = $logoPath; } $tenant->update($validated); \Log::info('Tenant nach Update:', [ 'show_prices' => $tenant->fresh()->show_prices, 'show_stock' => $tenant->fresh()->show_stock ]); return redirect()->route('admin.tenants.index') ->with('success', 'Mandant erfolgreich aktualisiert.'); } /** * Lösche einen Mandanten */ public function destroy(Tenant $tenant) { $user = Auth::user(); if (!$user->isSuperAdmin()) { abort(403, 'Nicht autorisiert'); } // Prüfe ob Mandant Daten hat if ($tenant->users()->count() > 0 || $tenant->vendingMachines()->count() > 0 || $tenant->products()->count() > 0) { return redirect()->route('admin.tenants.index') ->with('error', 'Mandant kann nicht gelöscht werden, da noch Daten vorhanden sind.'); } // Lösche Logo falls vorhanden if ($tenant->logo && file_exists(storage_path('app/public/' . $tenant->logo))) { unlink(storage_path('app/public/' . $tenant->logo)); } $tenant->delete(); return redirect()->route('admin.tenants.index') ->with('success', 'Mandant erfolgreich gelöscht.'); } }