ensureCorrectTenantSession(); $tenantId = $this->getCurrentTenantId(); $vendingMachines = VendingMachine::with(['tenant', 'slots']) ->when($tenantId, function($query, $tenantId) { return $query->where('tenant_id', $tenantId); }) ->paginate(10); return view('admin.vending-machines.index', compact('vendingMachines')); } /** * Show the form for creating a new vending machine. */ public function create(): View { $this->ensureCorrectTenantSession(); return view('admin.vending-machines.create'); } /** * Store a newly created vending machine. */ public function store(Request $request): RedirectResponse { $this->ensureCorrectTenantSession(); $tenantId = $this->getCurrentTenantId(); $request->validate([ 'name' => 'required|string|max:255', 'machine_number' => [ 'required', 'string', 'max:50', Rule::unique('vending_machines')->where(function ($query) use ($tenantId) { return $query->where('tenant_id', $tenantId); }) ], 'location' => 'required|string|max:255', 'description' => 'nullable|string', 'is_active' => 'boolean', ]); $vendingMachine = VendingMachine::create([ 'name' => $request->name, 'machine_number' => $request->machine_number, 'location' => $request->location, 'description' => $request->description, 'is_active' => $request->boolean('is_active', true), 'tenant_id' => $tenantId, ]); return redirect()->route('vending-machines.show', $vendingMachine) ->with('success', 'Automat erfolgreich erstellt.'); } /** * Display the specified vending machine. */ public function show($id): View { $this->ensureCorrectTenantSession(); $tenantId = $this->getCurrentTenantId(); $vendingMachine = VendingMachine::with(['tenant', 'slots.products']) ->where('id', $id) ->when($tenantId, function($query, $tenantId) { return $query->where('tenant_id', $tenantId); }) ->first(); if (!$vendingMachine) { return redirect()->route('vending-machines.index') ->with('error', 'Automat nicht gefunden oder Sie haben keine Berechtigung.'); } return view('admin.vending-machines.show', compact('vendingMachine')); } /** * Show the form for editing the specified vending machine. */ public function edit($id): View { $this->ensureCorrectTenantSession(); $tenantId = $this->getCurrentTenantId(); $vendingMachine = VendingMachine::where('id', $id); if ($tenantId) { $vendingMachine->where('tenant_id', $tenantId); } $vendingMachine = $vendingMachine->first(); if (!$vendingMachine) { return redirect()->route('vending-machines.index') ->with('error', 'Automat nicht gefunden oder Sie haben keine Berechtigung.'); } return view('admin.vending-machines.edit', compact('vendingMachine')); } /** * Update the specified vending machine. */ public function update(Request $request, $id): RedirectResponse { $this->ensureCorrectTenantSession(); $tenantId = $this->getCurrentTenantId(); $vendingMachine = VendingMachine::where('id', $id); if ($tenantId) { $vendingMachine->where('tenant_id', $tenantId); } $vendingMachine = $vendingMachine->first(); if (!$vendingMachine) { return redirect()->route('vending-machines.index') ->with('error', 'Automat nicht gefunden oder Sie haben keine Berechtigung.'); } $request->validate([ 'name' => 'required|string|max:255', 'machine_number' => [ 'required', 'string', 'max:50', Rule::unique('vending_machines')->where(function ($query) use ($tenantId) { return $query->where('tenant_id', $tenantId); })->ignore($vendingMachine->id) ], 'location' => 'required|string|max:255', 'description' => 'nullable|string', 'is_active' => 'boolean', ]); $vendingMachine->update([ 'name' => $request->name, 'machine_number' => $request->machine_number, 'location' => $request->location, 'description' => $request->description, 'is_active' => $request->boolean('is_active', true), ]); return redirect()->route('vending-machines.show', $vendingMachine) ->with('success', 'Automat erfolgreich aktualisiert.'); } /** * Remove the specified vending machine. */ public function destroy($id): RedirectResponse { $this->ensureCorrectTenantSession(); $tenantId = $this->getCurrentTenantId(); $vendingMachine = VendingMachine::where('id', $id); if ($tenantId) { $vendingMachine->where('tenant_id', $tenantId); } $vendingMachine = $vendingMachine->first(); if (!$vendingMachine) { return redirect()->route('vending-machines.index') ->with('error', 'Automat nicht gefunden oder Sie haben keine Berechtigung.'); } $vendingMachine->delete(); return redirect()->route('vending-machines.index')->with('success', 'Automat erfolgreich gelöscht.'); } /** * Generate QR code for vending machine */ public function generateQrCode($id) { // Automat mit Tenant-Beziehung suchen $vendingMachine = VendingMachine::with('tenant')->find($id); if (!$vendingMachine) { return response('Fehler: Automat mit ID ' . $id . ' nicht gefunden.', 404) ->header('Content-Type', 'text/plain'); } // Prüfe Tenant-Berechtigung für Tenant-Admins if (\Auth::user()->isTenantAdmin()) { if (!$vendingMachine->tenant_id || $vendingMachine->tenant_id !== \Auth::user()->tenant_id) { return response('Fehler: Keine Berechtigung für Automat ' . $id . '. VM Tenant: ' . $vendingMachine->tenant_id . ', User Tenant: ' . \Auth::user()->tenant_id, 403) ->header('Content-Type', 'text/plain'); } } // Prüfe ob Mandant und public_slug vorhanden if (!$vendingMachine->tenant || !$vendingMachine->tenant->public_slug) { return response('Fehler: Kein öffentlicher Slug konfiguriert für Tenant: ' . ($vendingMachine->tenant ? $vendingMachine->tenant->name : 'null'), 400) ->header('Content-Type', 'text/plain'); } // Prüfe ob machine_number vorhanden if (!$vendingMachine->machine_number) { return response('Fehler: Keine Maschinennummer konfiguriert für Automat: ' . $vendingMachine->name, 400) ->header('Content-Type', 'text/plain'); } // Erstelle URL für den QR-Code (mandantenspezifisch) $url = route('vending.public.machine', [ 'publicSlug' => $vendingMachine->tenant->public_slug, 'machineNumber' => $vendingMachine->machine_number ]); try { // Verwende SVG für bessere Kompatibilität $writer = new SvgWriter(); $filename = sprintf( 'qr-code-%s-automat-%s.svg', $vendingMachine->tenant->public_slug, $vendingMachine->machine_number ); // Erstelle QR-Code mit einfacher Konfiguration $qrCode = new QrCode($url); $result = $writer->write($qrCode); return response($result->getString()) ->header('Content-Type', $result->getMimeType()) ->header('Content-Disposition', 'attachment; filename="' . $filename . '"'); } catch (\Exception $e) { return response('QR-Code Fehler: ' . $e->getMessage(), 500) ->header('Content-Type', 'text/plain'); } } private function ensureCorrectTenantSession() { // Implementation details... } private function getCurrentTenantId() { return session('current_tenant') ? session('current_tenant')->id : \Auth::user()->tenant_id; } }